private List <IRouteValue> GetTableShardingValues(ShardingRule shardingRule, TableRule tableRule, ShardingCondition shardingCondition) { IShardingStrategy tableShardingStrategy = shardingRule.GetTableShardingStrategy(tableRule); return(IsGettingShardingValuesFromHint(tableShardingStrategy) ? GetTableShardingValuesFromHint() : GetShardingValuesFromShardingConditions(shardingRule, tableShardingStrategy.GetShardingColumns(), shardingCondition)); }
private static List <String> GetTableId(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints) { List <String> tableIdList = new List <string>(); Boolean shardByTable = IsShardByTable(shardingStrategy); if (shardByTable) { var tableId = GetTableIdByHints(hints); if (String.IsNullOrEmpty(tableId)) { List <IComparable> shardColumnValue = shardingStrategy.GetShardColumnValueList(logicDbName, parameters, hints); foreach (var comparable in shardColumnValue) { tableId = CalculateShardId(shardingStrategy, comparable); tableIdList.Add(tableId); } } else { tableIdList.Add(tableId); } } return(tableIdList); }
/// <summary> /// Initializes a new https ImgixSource object with multiple hosts. /// </summary> /// <param name="name">The name of the source</param> /// <param name="secureUrlToken">The secure url token for the source used to sign urls</param> /// <param name="hosts"> /// An array of hosts. /// If a host is only single word with no dots it will be assumed that it is an imgix source identifier and add .imgix.net /// </param> /// <param name="isHttps">Should urls use https</param> /// <param name="shardingStrategy"> /// What strategy should be used for sharding hosts. /// Note: Sharding can lead to problems /// http://perf.fail/post/96104709544/zealous-sharding-hurts-etsy-performance /// and /// https://docs.google.com/presentation/d/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM/present?slide=id.g518e3c87f_0_300 /// Recommended to only use two shards. /// </param> public ImgixSource(string name, string secureUrlToken, string[] hosts, bool isHttps, IShardingStrategy shardingStrategy) { if (String.IsNullOrWhiteSpace(name)) { throw new ArgumentException("Name cannot be empty", nameof(name)); } if (secureUrlToken == null) { throw new ArgumentNullException(nameof(secureUrlToken) + " cannot be null", nameof(secureUrlToken)); } if (hosts.Length == 0) { throw new ArgumentException("Must define atleast one host", nameof(hosts)); } if (shardingStrategy == null) { throw new ArgumentNullException(nameof(shardingStrategy)); } Name = name; _secureUrlToken = secureUrlToken; _isHttps = isHttps; _hosts = SanitizeHosts(hosts); _shardingStrategy = shardingStrategy; _hostsCount = _hosts.Length; }
/// <summary> /// 计算在哪个Shard执行操作 /// </summary> /// <param name="shardingStrategy"></param> /// <param name="shardColumnValue"></param> /// <returns></returns> private static String CalculateShardId(IShardingStrategy shardingStrategy, IComparable shardColumnValue) { if (shardingStrategy == null || shardColumnValue == null) { return(null); } return(shardingStrategy.ComputeShardId(shardColumnValue)); }
private static List <Statement> GetDefaultSqlStatement(String logicDbName, IShardingStrategy shardingStrategy, String sql, StatementParameterCollection parameters, IDictionary hints, SqlStatementType sqlType, OperationType?operationType = null) { if (String.IsNullOrEmpty(logicDbName)) { throw new DalException("Please specify databaseSet."); } if (String.IsNullOrEmpty(sql)) { throw new DalException("Please specify sql."); } var result = new List <Statement>(); var tupleList = ShardingUtil.GetShardInfo(logicDbName, shardingStrategy, parameters, hints); if (tupleList.Count < 1) { //非sharding的场合 Statement statement = GetStatement(logicDbName, StatementType.Sql, operationType ?? OperationType.Default, sqlType, hints, null); statement.StatementText = GetSql(sql, null); statement.Parameters = parameters; #if !NETSTANDARD CurrentStackCustomizedLog(statement); #endif result.Add(statement); } else { var bulkCopy = false; if (hints != null && hints.Contains(DALExtStatementConstant.BULK_COPY))//查看是否是批量插入的case { bulkCopy = Convert.ToBoolean(hints[DALExtStatementConstant.BULK_COPY]); } if (bulkCopy) { result.AddRange(BulkCopyCase(logicDbName, shardingStrategy, sql, parameters, hints, tupleList, sqlType, operationType)); } else { foreach (var tuple in tupleList) { Statement statement = GetStatement(logicDbName, StatementType.Sql, operationType ?? OperationType.Default, sqlType, hints, tuple.Item1); statement.StatementText = GetSql(sql, tuple.Item2); statement.Parameters = parameters; #if !NETSTANDARD CurrentStackCustomizedLog(statement); #endif result.Add(statement); } } } return(result); }
public static Boolean CheckKeyIsShardColumn(IShardingStrategy shardingStrategy, SqlTable table) { if (shardingStrategy == null || shardingStrategy.ShardColumns == null || shardingStrategy.ShardColumns.Count == 0) { return(false); } if (table == null || table.PkColumn == null || table.PkColumns.Count == 0) { return(false); } //only support one shard column now String shardColumn = shardingStrategy.ShardColumns[0]; return(String.Equals(shardColumn, table.PkColumns[0].Name, StringComparison.OrdinalIgnoreCase)); }
private static String GetTableId <T>(String logicDbName, IShardingStrategy shardingStrategy, T entity, ICollection <SqlColumn> columns, StatementParameterCollection parameters, IDictionary hints) { String tableId = null; Boolean shardByTable = IsShardByTable(shardingStrategy); if (shardByTable) { tableId = GetTableIdByHints(hints); if (String.IsNullOrEmpty(tableId)) { IComparable shardColumnValue = shardingStrategy.GetShardColumnValue(logicDbName, entity, columns, parameters, hints); tableId = CalculateShardId(shardingStrategy, shardColumnValue); } } return(tableId); }
/// <summary> /// ShardByDB by default /// </summary> /// <param name="shardingStrategy"></param> /// <returns></returns> public static ShardingType GetShardingType(IShardingStrategy shardingStrategy) { Boolean shardByDb = IsShardByDb(shardingStrategy); Boolean shardByTable = IsShardByTable(shardingStrategy); if (shardByDb && shardByTable) { return(ShardingType.ShardByDBAndTable); } if (shardByDb) { return(ShardingType.ShardByDB); } if (shardByTable) { return(ShardingType.ShardByTable); } return(ShardingType.ShardByDB); }
public static Tuple <String, String> GetShardInfo <T>(String logicDbName, IShardingStrategy shardingStrategy, T entity, ICollection <SqlColumn> columns, StatementParameterCollection parameters, IDictionary hints) { String shardId = null; String tableId = null; Boolean shardEnabled = IsShardEnabled(shardingStrategy); if (!shardEnabled) { return(Tuple.Create <String, String>(shardId, tableId)); } shardId = GetShardId(logicDbName, shardingStrategy, entity, columns, parameters, hints); tableId = GetTableId(logicDbName, shardingStrategy, entity, columns, parameters, hints); if (String.IsNullOrEmpty(shardId) && String.IsNullOrEmpty(tableId)) { throw new DalException("Please provide shard information."); } return(Tuple.Create <String, String>(shardId, tableId)); }
public static List <Statement> GetQueryStatement(String logicDbName, string sql, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints, OperationType?operationType = null) { var result = new List <Statement>(); var tupleList = ShardingUtil.GetShardInfo(logicDbName, shardingStrategy, parameters, hints); foreach (var tuple in tupleList) { Statement statement = new Statement { DatabaseSet = logicDbName, StatementType = StatementType.Sql, OperationType = operationType ?? OperationType.Default, Hints = hints, ShardID = tuple.Item1, TableName = "", SqlOperationType = SqlStatementType.SELECT, Parameters = parameters }; statement.StatementText = string.IsNullOrEmpty(tuple.Item2) ? sql : string.Format(sql, tuple.Item2); result.Add(statement); } return(result); }
//private static IDictionary<String, IList<T>> ShuffledByDb<T>(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, // IList<T> list, IDictionary hints) //{ // if (String.IsNullOrEmpty(logicDbName)) // return null; // if (list == null || list.Count == 0) // return null; // var dict = new Dictionary<String, IList<T>>(); // foreach (var item in list) // { // String shardId = GetShardId(logicDbName, shardingStrategy, parameters, hints); // if (String.IsNullOrEmpty(shardId)) // continue; // if (!dict.ContainsKey(shardId)) // dict.Add(shardId, new List<T>()); // dict[shardId].Add(item); // } // return dict; //} //private static IDictionary<String, IList<T>> ShuffledByTable<T>(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, // IList<T> list,IDictionary hints) //{ // if (String.IsNullOrEmpty(logicDbName)) // return null; // if (list == null || list.Count == 0) // return null; // var dict = new Dictionary<String, IList<T>>(); // foreach (var item in list) // { // String tableId = GetTableId(logicDbName, shardingStrategy, parameters, hints); // if (String.IsNullOrEmpty(tableId)) // continue; // if (!dict.ContainsKey(tableId)) // dict.Add(tableId, new List<T>()); // dict[tableId].Add(item); // } // return dict; //} //private static IDictionary<String, IDictionary<String, IList<T>>> ShuffledByDbTable<T>(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, // IList<T> list, IDictionary hints) //{ // if (String.IsNullOrEmpty(logicDbName)) // return null; // if (list == null || list.Count == 0) // return null; // var dict = new Dictionary<String, IDictionary<String, IList<T>>>(); // foreach (var item in list) // { // String shardId = GetShardId(logicDbName, shardingStrategy, parameters, hints); // String tableId = GetTableId(logicDbName, shardingStrategy , parameters,hints); // if (!dict.ContainsKey(shardId)) // dict.Add(shardId, new Dictionary<String, IList<T>>()); // if (!dict[shardId].ContainsKey(tableId)) // dict[shardId].Add(tableId, new List<T>()); // dict[shardId][tableId].Add(item); // } // return dict; //} #endregion Shuffled Items public static IList <Statement> GetShardStatement(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints, Func <IDictionary, List <Statement> > func, SqlStatementType sqlStatementType) { IList <Statement> statements; if (shardingStrategy == null) { return(null); } var shardingType = GetShardingType(shardingStrategy); if (shardingType != ShardingType.ShardByDBAndTable) { IList <String> shards = null; //Get shards from hints if (hints != null) { IList <String> temp = null; if (shardingType == ShardingType.ShardByDB) //是分库的情况 { if (hints.Contains(DALExtStatementConstant.SHARD_IDS)) //看下hints里面有没有指定分配id(一组) { temp = hints[DALExtStatementConstant.SHARD_IDS] as List <String>; } else if (hints.Contains(DALExtStatementConstant.SHARDID))//单个的分配id { temp = new List <String> { hints[DALExtStatementConstant.SHARDID] as String }; } } else if (shardingType == ShardingType.ShardByTable)//是分表的情况 { if (hints.Contains(DALExtStatementConstant.TABLE_IDS)) { temp = hints[DALExtStatementConstant.TABLE_IDS] as List <String>; } else if (hints.Contains(DALExtStatementConstant.TABLEID)) { temp = new List <String> { hints[DALExtStatementConstant.TABLEID] as String }; } } if (temp != null) { shards = temp; } } var bulkCopy = false; if (hints != null && hints.Contains(DALExtStatementConstant.BULK_COPY))//查看是否是批量插入的case { bulkCopy = Convert.ToBoolean(hints[DALExtStatementConstant.BULK_COPY]); } if (bulkCopy) { return(func.Invoke(hints)); } //Get shards from parameters 这里会根据 查询参数得出分配的信息 if (shards == null) { if (shardingType == ShardingType.ShardByDB) { shards = GetShardId(logicDbName, shardingStrategy, parameters, hints); } else if (shardingType == ShardingType.ShardByTable) { shards = GetTableId(logicDbName, shardingStrategy, parameters, hints); } } //对于不带条件的查询 都默认查询所有的 if ((shards == null || shards.Count == 0) && sqlStatementType.Equals(SqlStatementType.SELECT)) { shards = shardingStrategy.AllShards; } if (shards == null || shards.Count == 0) { throw new DalException("Please provide shard information."); } //Build statements statements = new List <Statement>(); foreach (var item in shards.Distinct()) { var newHints = HintsUtil.CloneHints(hints); switch (shardingType) { case ShardingType.ShardByDB: newHints[DALExtStatementConstant.SHARDID] = item; break; case ShardingType.ShardByTable: newHints[DALExtStatementConstant.TABLEID] = item; break; } var statement = func.Invoke(newHints); foreach (var ss in statement) { statements.Add(ss); } } } else { statements = new List <Statement>(); IDictionary <String, IList <String> > shardDict = null; if (hints != null && hints.Contains(DALExtStatementConstant.SHARD_TABLE_DICT)) { shardDict = hints[DALExtStatementConstant.SHARD_TABLE_DICT] as IDictionary <String, IList <String> >; } if (shardDict == null) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.SHARDID] = GetShardIdByHints(hints); newHints[DALExtStatementConstant.TABLEID] = GetTableIdByHints(hints); var statement = func.Invoke(newHints); foreach (var ss in statement) { statements.Add(ss); } } else { foreach (var shard in shardDict) { foreach (var table in shard.Value) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.SHARDID] = shard.Key; newHints[DALExtStatementConstant.TABLEID] = table; var statement = func.Invoke(newHints); foreach (var ss in statement) { statements.Add(ss); } } } } } return(statements); }
/// <summary> /// 获取分片信息 /// </summary> /// <param name="logicDbName"></param> /// <param name="shardingStrategy"></param> /// <param name="hints"></param> /// <returns></returns> public static List <Tuple <String, String> > GetShardInfo(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints) { List <String> shardId = null; List <String> tableId = null; var result = new List <Tuple <string, string> >(); Boolean shardEnabled = IsShardEnabled(shardingStrategy); if (!shardEnabled) { return(result); } shardId = GetShardId(logicDbName, shardingStrategy, parameters, hints); //是否有分库 tableId = GetTableId(logicDbName, shardingStrategy, parameters, hints); //分表 if (shardId.Count < 1 && tableId.Count < 1) { throw new DalException("Please provide shard information."); } if (shardId.Count > 0 && tableId.Count == 0) { foreach (var d in shardId) { result.Add(Tuple.Create <String, String>(d, null)); } } else if (shardId.Count == 0 && tableId.Count > 0) { foreach (var d in tableId) { result.Add(Tuple.Create <String, String>(null, d)); } } else { foreach (var d in shardId) { foreach (var t in tableId) { result.Add(Tuple.Create <String, String>(d, t)); } } } return(result); }
/// <summary> /// </summary> /// <param name="logicDbName"></param> /// <param name="shardingStrategy"></param> /// <param name="sql"></param> /// <param name="parameters"></param> /// <param name="extendedParameters"></param> /// <param name="operationType"></param> /// <param name="sqlStatementType"></param> /// <returns></returns> public static List <Statement> GetNonQueryStatement(String logicDbName, IShardingStrategy shardingStrategy, String sql, StatementParameterCollection parameters, IDictionary extendedParameters, OperationType?operationType = null, SqlStatementType?sqlStatementType = null) { return(GetDefaultSqlStatement(logicDbName, shardingStrategy, sql, parameters, extendedParameters, sqlStatementType ?? SqlStatementType.UNKNOWN, operationType ?? OperationType.Write)); }
public static IList <Statement> GetShardStatementByEntity <T>(String logicDbName, IShardingStrategy shardingStrategy, IList <T> list, SqlTable table, IDictionary hints, Func <IList <T>, IDictionary, Statement> func) where T : class, new() { if (String.IsNullOrEmpty(logicDbName)) { return(null); } if (list == null || list.Count == 0) { return(null); } if (table == null) { return(null); } var statements = new List <Statement>(); var shardingType = GetShardingType(shardingStrategy); if (shardingType == ShardingType.ShardByDB) { var dict = ShuffledByDb(logicDbName, shardingStrategy, list, table.ColumnList, hints); if (dict != null && dict.Count > 0) { foreach (var item in dict) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.SHARDID] = item.Key; Statement statement = func.Invoke(item.Value, newHints); statements.Add(statement); } } } else if (shardingType == ShardingType.ShardByTable) { var dict = ShuffledByTable(logicDbName, shardingStrategy, list, table.ColumnList, hints); if (dict != null && dict.Count > 0) { foreach (var item in dict) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.TABLEID] = item.Key; Statement statement = func.Invoke(item.Value, newHints); statements.Add(statement); } } } else { var dict = ShuffledByDbTable(logicDbName, shardingStrategy, list, table.ColumnList, hints); if (dict != null && dict.Count > 0) { foreach (var item in dict) { foreach (var item2 in item.Value) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.SHARDID] = item.Key; newHints[DALExtStatementConstant.TABLEID] = item2.Key; Statement statement = func.Invoke(item2.Value, newHints); statements.Add(statement); } } } } return(statements); }
/// <summary> /// /// </summary> /// <param name="shardingStrategy"></param> /// <returns></returns> private static Boolean IsShardByTable(IShardingStrategy shardingStrategy) { return(shardingStrategy != null && shardingStrategy.ShardByTable); }
private static IDictionary <String, IDictionary <String, IList <T> > > ShuffledByDbTable <T>(String logicDbName, IShardingStrategy shardingStrategy, IList <T> list, ICollection <SqlColumn> columns, IDictionary hints) { if (String.IsNullOrEmpty(logicDbName)) { return(null); } if (list == null || list.Count == 0) { return(null); } var dict = new Dictionary <String, IDictionary <String, IList <T> > >(); foreach (var item in list) { String shardId = GetShardId(logicDbName, shardingStrategy, item, columns, null, hints); String tableId = GetTableId(logicDbName, shardingStrategy, item, columns, null, hints); if (!dict.ContainsKey(shardId)) { dict.Add(shardId, new Dictionary <String, IList <T> >()); } if (!dict[shardId].ContainsKey(tableId)) { dict[shardId].Add(tableId, new List <T>()); } dict[shardId][tableId].Add(item); } return(dict); }
/// <summary> /// Initializes a new https ImgixSource object with multiple hosts. /// </summary> /// <param name="name">The name of the source</param> /// <param name="hosts"> /// An array of hosts. /// If a host is only single word with no dots it will be assumed that it is an imgix source identifier and add .imgix.net /// </param> /// <param name="isHttps">Should urls use https</param> /// <param name="shardingStrategy"> /// What strategy should be used for sharding hosts. /// Note: Sharding can lead to problems /// http://perf.fail/post/96104709544/zealous-sharding-hurts-etsy-performance /// and /// https://docs.google.com/presentation/d/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM/present?slide=id.g518e3c87f_0_300 /// Recommended to only use two shards. /// </param> public ImgixSource(string name, string[] hosts, bool isHttps, IShardingStrategy shardingStrategy) : this(name, "", hosts, isHttps, shardingStrategy) { }
/// <summary> /// 构造一个 <see cref="ShardingProperty"/>。 /// </summary> /// <param name="key">给定的属性键。</param> /// <param name="strategy">给定的 <see cref="IShardingStrategy"/>。</param> public ShardingProperty(TypeNamedKey key, IShardingStrategy strategy) { Key = key; Strategy = strategy; }
/// <summary> /// 增加指定类型的分片策略。 /// </summary> /// <param name="strategy">给定的 <see cref="IShardingStrategy"/>。</param> /// <returns>返回 <see cref="IShardingManager"/>。</returns> public virtual IShardingManager AddStrategy(IShardingStrategy strategy) { _strategies.AddOrUpdate(strategy.StrategyType, strategy, (key, value) => strategy); return(this); }
private bool IsGettingShardingValuesFromHint(IShardingStrategy shardingStrategy) { return(shardingStrategy is HintShardingStrategy); }
public static IList <Statement> GetShardStatement(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints, Func <IDictionary, Statement> func) { IList <Statement> statements; if (shardingStrategy == null) { return(null); } var shardingType = GetShardingType(shardingStrategy); if (shardingType != ShardingType.ShardByDBAndTable) { IList <String> shards = null; //Get shards from hints if (hints != null) { IList <String> temp = null; if (shardingType == ShardingType.ShardByDB) { if (hints.Contains(DALExtStatementConstant.SHARD_IDS)) { temp = hints[DALExtStatementConstant.SHARD_IDS] as List <String>; } else if (hints.Contains(DALExtStatementConstant.SHARDID)) { temp = new List <String> { hints[DALExtStatementConstant.SHARDID] as String }; } } else if (shardingType == ShardingType.ShardByTable) { if (hints.Contains(DALExtStatementConstant.TABLE_IDS)) { temp = hints[DALExtStatementConstant.TABLE_IDS] as List <String>; } else if (hints.Contains(DALExtStatementConstant.TABLEID)) { temp = new List <String> { hints[DALExtStatementConstant.TABLEID] as String }; } } if (temp != null) { shards = temp; } } //Get shards from parameters if (shards == null) { if (parameters != null) { if (shardingType == ShardingType.ShardByDB) { String shardId = GetShardId <Object>(logicDbName, shardingStrategy, null, null, parameters, hints); if (!String.IsNullOrEmpty(shardId)) { shards = new List <String> { shardId } } ; } else if (shardingType == ShardingType.ShardByTable) { String tableId = GetTableId <Object>(logicDbName, shardingStrategy, null, null, parameters, hints); if (!String.IsNullOrEmpty(tableId)) { shards = new List <String> { tableId } } ; } } } if (shards == null) { throw new DalException("Please provide shard information."); } //Build statements statements = new List <Statement>(); foreach (var item in shards) { var newHints = HintsUtil.CloneHints(hints); switch (shardingType) { case ShardingType.ShardByDB: newHints[DALExtStatementConstant.SHARDID] = item; break; case ShardingType.ShardByTable: newHints[DALExtStatementConstant.TABLEID] = item; break; } Statement statement = func.Invoke(newHints); statements.Add(statement); } } else { statements = new List <Statement>(); IDictionary <String, IList <String> > shardDict = null; if (hints != null && hints.Contains(DALExtStatementConstant.SHARD_TABLE_DICT)) { shardDict = hints[DALExtStatementConstant.SHARD_TABLE_DICT] as IDictionary <String, IList <String> >; } if (shardDict == null) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.SHARDID] = GetShardIdByHints(hints); newHints[DALExtStatementConstant.TABLEID] = GetTableIdByHints(hints); Statement statement = func.Invoke(newHints); statements.Add(statement); } else { foreach (var shard in shardDict) { foreach (var table in shard.Value) { var newHints = HintsUtil.CloneHints(hints); newHints[DALExtStatementConstant.SHARDID] = shard.Key; newHints[DALExtStatementConstant.TABLEID] = table; Statement statement = func.Invoke(newHints); statements.Add(statement); } } } } return(statements); }
/// <summary> /// Initializes a new https ImgixSource object with multiple hosts. /// </summary> /// <param name="name">The name of the source</param> /// <param name="secureUrlToken">The secure url token for the source used to sign urls</param> /// <param name="hosts"> /// An array of hosts. /// If a host is only single word with no dots it will be assumed that it is an imgix source identifier and add .imgix.net /// </param> /// <param name="shardingStrategy"> /// What strategy should be used for sharding hosts. /// Note: Sharding can lead to problems /// http://perf.fail/post/96104709544/zealous-sharding-hurts-etsy-performance /// and /// https://docs.google.com/presentation/d/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM/present?slide=id.g518e3c87f_0_300 /// Recommended to only use two shards. /// </param> public ImgixSource(string name, string secureUrlToken, string[] hosts, IShardingStrategy shardingStrategy) : this(name, secureUrlToken, hosts, true, shardingStrategy) { }
/// <summary> /// Whether shard is enabled /// </summary> /// <param name="shardingStrategy"></param> /// <returns></returns> public static Boolean IsShardEnabled(IShardingStrategy shardingStrategy) { return(shardingStrategy != null); }
/// <summary> /// 批量插入分片规则: 解析sqlstring 按照分片进行分组 在重新组合 如果没有找到分片的默认第一个分片 /// </summary> /// <param name="logicDbName"></param> /// <param name="shardingStrategy"></param> /// <param name="sql"></param> /// <param name="parameters"></param> /// <param name="hints"></param> /// <param name="tupleList"></param> /// <param name="sqlType"></param> /// <param name="operationType"></param> /// <returns></returns> private static List <Statement> BulkCopyCase(String logicDbName, IShardingStrategy shardingStrategy, String sql, StatementParameterCollection parameters, IDictionary hints, List <Tuple <String, String> > tupleList, SqlStatementType sqlType, OperationType?operationType = null) { var result = new List <Statement>(); //var shardingDB = tuple.Item1; //var sharingTable = tuple.Item2; if (shardingStrategy.ShardByDB && shardingStrategy.ShardByTable) { //又分表又分库的情况 } else if (shardingStrategy.ShardByDB || shardingStrategy.ShardByTable) { var dicValues = new Dictionary <string, Tuple <List <string>, StatementParameterCollection> >(); foreach (var tuple in tupleList) { dicValues.Add(shardingStrategy.ShardByDB?tuple.Item1: tuple.Item2, Tuple.Create(new List <string>(), new StatementParameterCollection())); } var defaultSharding = dicValues.Keys.First(); //分库的情况 var arr = sql.Split(new string[] { "VALUES" }, StringSplitOptions.None); if (arr.Length != 2) { throw new DalException("sharding db for bulkInsert sql string err."); } var title = arr[0] + " VALUES "; var body = arr[1].Replace("\r\n", ""); var values = body.Split(')').Where(r => !string.IsNullOrEmpty(r)).Select(r => r.StartsWith(",")?r.Substring(1):r).ToArray(); //总共有多少行 var first = values.First(); var cloumnCount = first.Split(',').Length; //每行总共有多少列 if (parameters.Count != (cloumnCount * values.Length)) { throw new DalException("sharding db for bulkInsert sql parameters counts err."); } var ii = 0; //将parameters 按 分库进行分组 for (int i = 0; i < values.Length; i++) { var columns = values[i].Split(','); var haveShardingC = false; var shardingValue = string.Empty; List <StatementParameter> newC = new List <StatementParameter>(); for (int j = 0; j < columns.Length; j++) { var p = parameters.ElementAt(ii); if (p.IsShardingColumn) { haveShardingC = true; shardingValue = p.ShardingValue; } newC.Add(p); ii++; } if (haveShardingC) { if (!string.IsNullOrEmpty(shardingValue)) { if (dicValues.ContainsKey(shardingValue)) { dicValues[shardingValue].Item1.Add(values[i] + ")"); foreach (var pp in newC) { dicValues[shardingValue].Item2.Add(pp); } } } else { //添加到第一个分片 dicValues[defaultSharding].Item1.Add(values[i] + ")"); foreach (var pp in newC) { dicValues[defaultSharding].Item2.Add(pp); } } } } foreach (var dic in dicValues) { if (dic.Value.Item1.Count == 0) { continue; } var newHints = HintsUtil.CloneHints(hints); if (shardingStrategy.ShardByDB) { newHints[DALExtStatementConstant.SHARDID] = dic.Key; } else { newHints[DALExtStatementConstant.TABLEID] = dic.Key; } var statement = GetStatement(logicDbName, StatementType.Sql, operationType ?? OperationType.Default, sqlType, newHints, shardingStrategy.ShardByDB? dic.Key:null); statement.StatementText = shardingStrategy.ShardByDB ? (title + string.Join(",", dic.Value.Item1)): GetSql(title + string.Join(",", dic.Value.Item1), dic.Key); statement.Parameters = dic.Value.Item2; #if !NETSTANDARD CurrentStackCustomizedLog(statement); #endif result.Add(statement); } } return(result); }
/// <summary> /// GetScalarStatement /// </summary> /// <param name="logicDbName"></param> /// <param name="shardingStrategy"></param> /// <param name="sql"></param> /// <param name="parameters"></param> /// <param name="extendedParameters"></param> /// <param name="operationType"></param> /// <returns></returns> public static List <Statement> GetScalarStatement(String logicDbName, IShardingStrategy shardingStrategy, String sql, StatementParameterCollection parameters, IDictionary extendedParameters, OperationType?operationType = null) { return(GetDefaultSqlStatement(logicDbName, shardingStrategy, sql, parameters, extendedParameters, SqlStatementType.SELECT, operationType ?? OperationType.Default)); }
public void RegisterStrategy <T>(IShardingStrategy strategy) { _strategies[typeof(T)] = strategy; }