public TableRule(TableRuleConfiguration tableRuleConfig, ShardingDataSourceNames shardingDataSourceNames, string defaultGenerateKeyColumn) { LogicTable = tableRuleConfig.LogicTable.ToLower(); List <string> dataNodes = tableRuleConfig.ActualDataNodes ?? new List <string>(0); // List<string> dataNodes = new InlineExpressionParser(tableRuleConfig.GetActualDataNodes()).splitAndEvaluate(); // dataNodeIndexMap = new HashMap<>(dataNodes.size(), 1); dataNodeIndexMap = new Dictionary <DataNode, int>(dataNodes.Count); ActualDataNodes = IsEmptyDataNodes(dataNodes) ? GenerateDataNodes(tableRuleConfig.LogicTable, shardingDataSourceNames.DataSourceNames) : GenerateDataNodes(dataNodes, shardingDataSourceNames.DataSourceNames); //ActualDataNodes = GenerateDataNodes(tableRuleConfig.LogicTable, shardingDataSourceNames.DataSourceNames); actualTables = GetActualTables(); DatabaseShardingStrategy = null == tableRuleConfig.DatabaseShardingStrategyConfig ? null : ShardingStrategyFactory.NewInstance(tableRuleConfig.DatabaseShardingStrategyConfig); TableShardingStrategy = null == tableRuleConfig.TableShardingStrategyConfig ? null : ShardingStrategyFactory.NewInstance(tableRuleConfig.TableShardingStrategyConfig); KeyGeneratorConfiguration keyGeneratorConfiguration = tableRuleConfig.KeyGeneratorConfig; generateKeyColumn = null != keyGeneratorConfiguration && !string.IsNullOrWhiteSpace(keyGeneratorConfiguration.Column) ? keyGeneratorConfiguration.Column : defaultGenerateKeyColumn; ShardingKeyGenerator = ContainsKeyGeneratorConfiguration(tableRuleConfig) ? new ShardingKeyGeneratorServiceLoader().NewService(tableRuleConfig.KeyGeneratorConfig.Type, tableRuleConfig.KeyGeneratorConfig.Properties) : null; // CheckRule(dataNodes); }
/// <summary> /// 找到实际的默认数据源名称如果是读写分离那么将使用master数据源名称 /// </summary> /// <returns></returns> public string FindActualDefaultDataSourceName() { string defaultDataSourceName = ShardingDataSourceNames.GetDefaultDataSourceName(); if (string.IsNullOrEmpty(defaultDataSourceName)) { return(null); } var masterDefaultDataSourceName = FindMasterDataSourceName(defaultDataSourceName); return(masterDefaultDataSourceName ?? defaultDataSourceName); }
/** * Get table rule. * * @param logicTableName logic table name * @return table rule */ public TableRule GetTableRule(string logicTableName) { var tableRule = FindTableRule(logicTableName); if (tableRule != null) { return(tableRule); } if (IsBroadcastTable(logicTableName)) { return(new TableRule(ShardingDataSourceNames.DataSourceNames, logicTableName)); } if (!string.IsNullOrEmpty(ShardingDataSourceNames.GetDefaultDataSourceName())) { return(new TableRule(ShardingDataSourceNames.GetDefaultDataSourceName(), logicTableName)); } throw new ShardingException($"Cannot find table rule and default data source with logic table: '{logicTableName}'"); }
public ShardingRule(ShardingRuleConfiguration shardingRuleConfig, ICollection <string> dataSourceNames) { if (shardingRuleConfig == null) { throw new ArgumentNullException(nameof(shardingRuleConfig)); } if (dataSourceNames == null || dataSourceNames.IsEmpty()) { throw new ArgumentNullException("data sources cannot be empty."); } this.RuleConfiguration = shardingRuleConfig; ShardingDataSourceNames = new ShardingDataSourceNames(shardingRuleConfig, dataSourceNames); TableRules = CreateTableRules(shardingRuleConfig); BroadcastTables = shardingRuleConfig.BroadcastTables; BindingTableRules = CreateBindingTableRules(shardingRuleConfig.BindingTableGroups); DefaultDatabaseShardingStrategy = CreateDefaultShardingStrategy(shardingRuleConfig.DefaultDatabaseShardingStrategyConfig); DefaultTableShardingStrategy = CreateDefaultShardingStrategy(shardingRuleConfig.DefaultTableShardingStrategyConfig); DefaultShardingKeyGenerator = CreateDefaultKeyGenerator(shardingRuleConfig.DefaultKeyGeneratorConfig); MasterSlaveRules = CreateMasterSlaveRules(shardingRuleConfig.MasterSlaveRuleConfigs); }
/** * Judge if default data source mame exists. * * @return if default data source name exists */ public bool HasDefaultDataSourceName() { string defaultDataSourceName = ShardingDataSourceNames.GetDefaultDataSourceName(); return(!string.IsNullOrEmpty(defaultDataSourceName)); }