/** * Create sharding data source. * * @param dataSourceMap data source map * @param shardingRuleConfig rule configuration for databases and tables sharding * @param configMap config map * @param props properties for data source * @return sharding data source * @throws SQLException SQL exception */ public static DataSource createDataSource( final Map<String, DataSource> dataSourceMap, final ShardingRuleConfiguration shardingRuleConfig, final Map<String, Object> configMap, final Properties props) throws SQLException { return new ShardingDataSource(dataSourceMap, new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), configMap, props); } }
private Map<String, DataSourceMetaData> getDataSourceMetaDataMap(final Map<String, String> dataSourceURLs, final ShardingRule shardingRule, final DatabaseType databaseType) { Map<String, DataSourceMetaData> dataSourceMetaData = getDataSourceMetaDataMapForSharding(dataSourceURLs, databaseType); return shardingRule.getMasterSlaveRules().isEmpty() ? dataSourceMetaData : getDataSourceMetaDataMapForMasterSlave(shardingRule, dataSourceMetaData); }
@Override public void fill(final TableSegment sqlSegment, final SQLStatement sqlStatement, final String sql, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) { boolean fill = false; String tableName = sqlSegment.getName(); if (shardingRule.contains(tableName) || shardingRule.isBroadcastTable(tableName) || shardingRule.findBindingTableRule(tableName).isPresent() || shardingRule.getShardingDataSourceNames().getDataSourceNames().contains(shardingRule.getShardingDataSourceNames().getDefaultDataSourceName())) { fill = true; } else { if (!(sqlStatement instanceof SelectStatement) && sqlStatement.getTables().isEmpty()) { fill = true; } } if (fill) { sqlStatement.getTables().add(new Table(sqlSegment.getName(), sqlSegment.getAlias())); sqlStatement.getSQLTokens().add(sqlSegment.getToken()); } } }
public ShardingRule(final ShardingRuleConfiguration shardingRuleConfig, final Collection<String> dataSourceNames) { Preconditions.checkArgument(!dataSourceNames.isEmpty(), "Data sources cannot be empty."); this.shardingRuleConfig = shardingRuleConfig; shardingDataSourceNames = new ShardingDataSourceNames(shardingRuleConfig, dataSourceNames); tableRules = createTableRules(shardingRuleConfig); bindingTableRules = createBindingTableRules(shardingRuleConfig.getBindingTableGroups()); broadcastTables = shardingRuleConfig.getBroadcastTables(); defaultDatabaseShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultDatabaseShardingStrategyConfig()); defaultTableShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultTableShardingStrategyConfig()); defaultShardingKeyGenerator = createDefaultKeyGenerator(shardingRuleConfig.getDefaultKeyGeneratorConfig()); masterSlaveRules = createMasterSlaveRules(shardingRuleConfig.getMasterSlaveRuleConfigs()); }
protected boolean isAccumulate() { return !connection.getShardingContext().getShardingRule().isAllBroadcastTables(sqlStatement.getTables().getTableNames()); }
@Override public RoutingResult route() { RoutingResult result = new RoutingResult(); if (shardingRule.isAllBroadcastTables(logicTables)) { List<RoutingTable> routingTables = new ArrayList<>(logicTables.size()); for (String each : logicTables) { routingTables.add(new RoutingTable(each, each)); TableUnit tableUnit = new TableUnit(shardingRule.getShardingDataSourceNames().getRandomDataSourceName()); tableUnit.getRoutingTables().addAll(routingTables); result.getTableUnits().getTableUnits().add(tableUnit); } else if (logicTables.isEmpty()) { result.getTableUnits().getTableUnits().add(new TableUnit(shardingRule.getShardingDataSourceNames().getRandomDataSourceName())); } else if (1 == logicTables.size()) { String logicTableName = logicTables.iterator().next(); DataNode dataNode = shardingRule.getDataNode(logicTableName); TableUnit tableUnit = new TableUnit(dataNode.getDataSourceName()); tableUnit.getRoutingTables().add(new RoutingTable(logicTableName, dataNode.getTableName())); boolean first = true; for (String each : logicTables) { TableRule tableRule = shardingRule.getTableRule(each); DataNode dataNode = tableRule.getActualDataNodes().get(0); routingTables.add(new RoutingTable(each, dataNode.getTableName())); TableUnit tableUnit = new TableUnit(shardingRule.getShardingDataSourceNames().getRandomDataSourceName(availableDatasourceNames)); tableUnit.getRoutingTables().addAll(routingTables); result.getTableUnits().getTableUnits().add(tableUnit);
return getDCLRoutingEngine(shardingRule, sqlStatement, shardingDataSourceMetaData); if (shardingRule.isAllInDefaultDataSource(tableNames)) { return new DefaultDatabaseRoutingEngine(shardingRule, tableNames); if (shardingRule.isAllBroadcastTables(tableNames)) { return SQLType.DQL == sqlStatement.getType() ? new UnicastRoutingEngine(shardingRule, tableNames) : new DatabaseBroadcastRoutingEngine(shardingRule); return new UnicastRoutingEngine(shardingRule, tableNames); Collection<String> shardingTableNames = shardingRule.getShardingLogicTableNames(tableNames); if (1 == shardingTableNames.size() || shardingRule.isAllBindingTables(shardingTableNames)) { return new StandardRoutingEngine(shardingRule, shardingTableNames.iterator().next(), shardingConditions);
private Collection<BindingTableRule> createBindingTableRules(final Collection<String> bindingTableGroups) { Collection<BindingTableRule> result = new ArrayList<>(bindingTableGroups.size()); for (String each : bindingTableGroups) { result.add(createBindingTableRule(each)); } return result; }
@Override public boolean isAccumulate() { return !connection.getShardingContext().getShardingRule().isAllBroadcastTables(routeResult.getSqlStatement().getTables().getTableNames()); }
private ShardingRule createShardingRule(final ShardingRuleConfiguration shardingRuleConfig, final Collection<String> dataSourceNames, final boolean isUsingRegistry) { return isUsingRegistry ? new OrchestrationShardingRule(shardingRuleConfig, dataSourceNames) : new ShardingRule(shardingRuleConfig, dataSourceNames); }
public PreparedStatementRoutingEngine(final String logicSQL, final ShardingRule shardingRule, final ShardingMetaData shardingMetaData, final DatabaseType databaseType, final boolean showSQL) { this.logicSQL = logicSQL; shardingRouter = ShardingRouterFactory.newInstance(shardingRule, shardingMetaData, databaseType, showSQL); masterSlaveRouter = new ShardingMasterSlaveRouter(shardingRule.getMasterSlaveRules()); }
@Override public boolean isAccumulate() { return !connection.getShardingContext().getShardingRule().isAllBroadcastTables(routeResult.getSqlStatement().getTables().getTableNames()); }
private ShardingRule createShardingRule(final ShardingRuleConfiguration shardingRuleConfig, final Collection<String> dataSourceNames, final boolean isUsingRegistry) { return isUsingRegistry ? new OrchestrationShardingRule(shardingRuleConfig, dataSourceNames) : new ShardingRule(shardingRuleConfig, dataSourceNames); }
public StatementRoutingEngine(final ShardingRule shardingRule, final ShardingMetaData shardingMetaData, final DatabaseType databaseType, final boolean showSQL) { shardingRouter = ShardingRouterFactory.newInstance(shardingRule, shardingMetaData, databaseType, showSQL); masterSlaveRouter = new ShardingMasterSlaveRouter(shardingRule.getMasterSlaveRules()); }
private PostgreSQLCommandResponsePackets merge(final SQLStatement sqlStatement) throws SQLException { if (executeResponse instanceof ExecuteUpdateResponse) { if (logicSchema instanceof ShardingSchema && ((ShardingSchema) logicSchema).getShardingRule().isAllBroadcastTables(sqlStatement.getTables().getTableNames())) { return new PostgreSQLCommandResponsePackets(((ExecuteUpdateResponse) executeResponse).getPackets().get(0)); } return ((ExecuteUpdateResponse) executeResponse).merge(); } mergedResult = MergeEngineFactory.newInstance( DatabaseType.PostgreSQL, getShardingRule(), sqlStatement, logicSchema.getMetaData().getTable(), ((ExecuteQueryResponse) executeResponse).getQueryResults()).merge(); if (mergedResult instanceof ShowTablesMergedResult) { ((ShowTablesMergedResult) mergedResult).resetColumnLabel(logicSchema.getName()); setResponseColumnLabelForShowTablesMergedResult(((ExecuteQueryResponse) executeResponse).getPostgreSQLQueryResponsePackets()); } PostgreSQLQueryResponsePackets result = getQueryResponsePacketsWithoutDerivedColumns(((ExecuteQueryResponse) executeResponse).getPostgreSQLQueryResponsePackets()); currentSequenceId = result.getPackets().size(); return result; }
private static DataSource createDataSource(final Map<String, DataSource> dataSourceMap, final YamlShardingRuleConfiguration yamlConfig, final Map<String, Object> configMap, final Properties props, final OrchestrationConfiguration orchestrationConfig) throws SQLException { if (null == yamlConfig) { return new OrchestrationShardingDataSource(orchestrationConfig); } else { ShardingDataSource shardingDataSource = new ShardingDataSource( dataSourceMap, new ShardingRule(yamlConfig.getShardingRuleConfiguration(), dataSourceMap.keySet()), configMap, props); return new OrchestrationShardingDataSource(shardingDataSource, orchestrationConfig); } }
/** * Renew disabled data source names. * * @param disabledStateChangedEvent disabled state changed event */ @Subscribe public synchronized void renew(final DisabledStateChangedEvent disabledStateChangedEvent) { OrchestrationShardingSchema shardingSchema = disabledStateChangedEvent.getShardingSchema(); if (getName().equals(shardingSchema.getSchemaName())) { for (MasterSlaveRule each : shardingRule.getMasterSlaveRules()) { ((OrchestrationMasterSlaveRule) each).updateDisabledDataSourceNames(shardingSchema.getDataSourceName(), disabledStateChangedEvent.isDisabled()); } } } }
private CommandResponsePackets merge(final SQLStatement sqlStatement) throws SQLException { if (executeResponse instanceof ExecuteUpdateResponse) { if (logicSchema instanceof ShardingSchema && ((ShardingSchema) logicSchema).getShardingRule().isAllBroadcastTables(sqlStatement.getTables().getTableNames())) { return new CommandResponsePackets(((ExecuteUpdateResponse) executeResponse).getPackets().get(0)); } return ((ExecuteUpdateResponse) executeResponse).merge(); } mergedResult = MergeEngineFactory.newInstance( DatabaseType.MySQL, getShardingRule(), sqlStatement, logicSchema.getMetaData().getTable(), ((ExecuteQueryResponse) executeResponse).getQueryResults()).merge(); if (mergedResult instanceof ShowTablesMergedResult) { ((ShowTablesMergedResult) mergedResult).resetColumnLabel(logicSchema.getName()); setResponseColumnLabelForShowTablesMergedResult(((ExecuteQueryResponse) executeResponse).getQueryResponsePackets()); } QueryResponsePackets result = getQueryResponsePacketsWithoutDerivedColumns(((ExecuteQueryResponse) executeResponse).getQueryResponsePackets()); currentSequenceId = result.getPackets().size(); return result; }
/** * Create sharding data source. * * @param dataSourceMap data source map * @param shardingRuleConfig sharding rule configuration * @param orchestrationConfig orchestration configuration * @param configMap config map * @param props properties for data source * @return sharding data source * @throws SQLException SQL exception */ public static DataSource createDataSource(final Map<String, DataSource> dataSourceMap, final ShardingRuleConfiguration shardingRuleConfig, final Map<String, Object> configMap, final Properties props, final OrchestrationConfiguration orchestrationConfig) throws SQLException { if (null == shardingRuleConfig || shardingRuleConfig.getTableRuleConfigs().isEmpty()) { return createDataSource(orchestrationConfig); } ShardingDataSource shardingDataSource = new ShardingDataSource(dataSourceMap, new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), configMap, props); return new OrchestrationShardingDataSource(shardingDataSource, orchestrationConfig); }
/** * Renew disabled data source names. * * @param disabledStateChangedEvent disabled state changed event */ @Subscribe public synchronized void renew(final DisabledStateChangedEvent disabledStateChangedEvent) { OrchestrationShardingSchema shardingSchema = disabledStateChangedEvent.getShardingSchema(); if (getName().equals(shardingSchema.getSchemaName())) { for (MasterSlaveRule each : shardingRule.getMasterSlaveRules()) { ((OrchestrationMasterSlaveRule) each).updateDisabledDataSourceNames(shardingSchema.getDataSourceName(), disabledStateChangedEvent.isDisabled()); } } } }