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]

Reply via email to