jianzh5 opened a new issue, #22140: URL: https://github.com/apache/shardingsphere/issues/22140
hello,everyone: i want to config actual-data-nodes while my actual-data-nodes tables is dynamic ,i found solution through this issue https://github.com/apache/shardingsphere/issues/16725。 when i try it on sharding-jdbc 5.2.1 , this method can change actual-data-nodes actually,but lose KeyGenerators,This error is reported at startup。 ```java ### Cause: java.sql.SQLException: Field 'EVENT_ID' doesn't have a default value ; Field 'EVENT_ID' doesn't have a default value; nested exception is java.sql.SQLException: Field 'EVENT_ID' doesn't have a default value ``` ```java public class InitActualDataNodesExample implements ApplicationRunner { private final DataSource dataSource; @Override public void run(ApplicationArguments args) { initActualDataNodes((ShardingSphereDataSource) dataSource); } private void initActualDataNodes(ShardingSphereDataSource dataSource) { // 更新 context ContextManager contextManager = getContextManager(dataSource); Collection<RuleConfiguration> addRuleConfigs = new LinkedList<>(); Collection<RuleConfiguration> configurations = contextManager.getMetaDataContexts().getMetaData().getDatabases() .get("logic_db").getRuleMetaData().getConfigurations(); for (RuleConfiguration configuration : configurations) { if(configuration instanceof ShardingRuleConfiguration){ ShardingRuleConfiguration algorithmProvidedShardingRuleConfiguration = (ShardingRuleConfiguration) configuration; ShardingRuleConfiguration addRuleConfiguration = new ShardingRuleConfiguration(); Collection<ShardingTableRuleConfiguration> addTableConfigurations = new LinkedList<>(); for (ShardingTableRuleConfiguration shardingTableRuleConfiguration : algorithmProvidedShardingRuleConfiguration.getTables()) { if ("T_EVENT".equals(shardingTableRuleConfiguration.getLogicTable())) { String actualDataNodes2 = "ds$->{0..1}.T_EVENT_$->{20221111..20221121}"; ShardingTableRuleConfiguration addTableConfiguration = new ShardingTableRuleConfiguration(shardingTableRuleConfiguration.getLogicTable(), actualDataNodes2); addTableConfiguration.setTableShardingStrategy(shardingTableRuleConfiguration.getTableShardingStrategy()); addTableConfiguration.setDatabaseShardingStrategy(shardingTableRuleConfiguration.getDatabaseShardingStrategy()); addTableConfiguration.setKeyGenerateStrategy(shardingTableRuleConfiguration.getKeyGenerateStrategy()); addTableConfigurations.add(addTableConfiguration); } else { addTableConfigurations.add(shardingTableRuleConfiguration); } } addRuleConfiguration.setTables(addTableConfigurations); addRuleConfiguration.setAutoTables(algorithmProvidedShardingRuleConfiguration.getAutoTables()); addRuleConfiguration.setBindingTableGroups(algorithmProvidedShardingRuleConfiguration.getBindingTableGroups()); addRuleConfiguration.setBroadcastTables(algorithmProvidedShardingRuleConfiguration.getBroadcastTables()); addRuleConfiguration.setDefaultDatabaseShardingStrategy(algorithmProvidedShardingRuleConfiguration.getDefaultDatabaseShardingStrategy()); addRuleConfiguration.setDefaultTableShardingStrategy(algorithmProvidedShardingRuleConfiguration.getDefaultTableShardingStrategy()); addRuleConfiguration.setDefaultKeyGenerateStrategy(algorithmProvidedShardingRuleConfiguration.getDefaultKeyGenerateStrategy()); addRuleConfiguration.setDefaultShardingColumn(algorithmProvidedShardingRuleConfiguration.getDefaultShardingColumn()); addRuleConfiguration.setShardingAlgorithms(algorithmProvidedShardingRuleConfiguration.getShardingAlgorithms()); addRuleConfiguration.setKeyGenerators(algorithmProvidedShardingRuleConfiguration.getKeyGenerators()); addRuleConfigs.add(addRuleConfiguration); }else{ addRuleConfigs.add(configuration); } } contextManager.alterRuleConfiguration("logic_db", addRuleConfigs); } private ContextManager getContextManager(ShardingSphereDataSource dataSource) { try { Field contextManagerField = dataSource.getClass().getDeclaredField("contextManager"); contextManagerField.setAccessible(true); return (ContextManager) contextManagerField.get(dataSource); } catch (Exception e) { throw new RuntimeException("系统异常"); } } } ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
