huangxiuqi commented on issue #22356:
URL:
https://github.com/apache/shardingsphere/issues/22356#issuecomment-1324764405
Try to use Java API configuration, return DataSourceProxy directly, but it
cannot be started,so this way doesn't work
```java
@Configuration
public class ShardingSphereJdbcConfiguration {
@Bean
public DataSource dataSource() throws SQLException {
// 配置数据源
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("ds0", createDataSource("seata_order0"));
dataSourceMap.put("ds1", createDataSource("seata_order1"));
List<RuleConfiguration> rules = Arrays.asList(
createShardingRuleConfiguration(),
createTransactionRuleConfiguration());
return ShardingSphereDataSourceFactory.createDataSource(
dataSourceMap, rules, new Properties());
}
private DataSource createDataSource(String name) {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/" + name +
"?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8");
dataSource.setUsername("root");
dataSource.setPassword("root");
// return dataSource;
// 返回Seata代理数据源
return new DataSourceProxy(dataSource);
}
private ShardingRuleConfiguration createShardingRuleConfiguration() {
ShardingRuleConfiguration result = new ShardingRuleConfiguration();
// 添加分库分表规则
result.getTables().add(getOrderTableRuleConfiguration());
// 添加order_database_rule规则,按照user_id取余
Properties props1 = new Properties();
props1.setProperty("algorithm-expression", "ds${user_id % 2}");
result.getShardingAlgorithms().put(
"order_database_rule",
new AlgorithmConfiguration("INLINE", props1));
// 添加order_table_rule规则,按照order_id取余
Properties props2 = new Properties();
props2.setProperty("algorithm-expression", "order_tbl${id % 2}");
result.getShardingAlgorithms().put(
"order_table_rule",
new AlgorithmConfiguration("INLINE", props2));
// 添加snowflake规则,雪花算法生成id
result.getKeyGenerators().put(
"snowflake",
new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
// 添加sharding_key_required_auditor规则,要求DML语句必须包含分片键
result.getAuditors().put(
"sharding_key_required_auditor",
new AlgorithmConfiguration("DML_SHARDING_CONDITIONS", new
Properties()));
return result;
}
private TransactionRuleConfiguration
createTransactionRuleConfiguration() {
return new TransactionRuleConfiguration("BASE", "Seata", new
Properties());
}
private ShardingTableRuleConfiguration getOrderTableRuleConfiguration() {
// 分库分表命名规则 分ds0,ds1两个数据库,每个数据库各分t_order0,t_order1两个表
ShardingTableRuleConfiguration result = new
ShardingTableRuleConfiguration("order_tbl", "ds${0..1}.order_tbl${0..1}");
// 根据user_id分库,规则名称order_database_rule
result.setDatabaseShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "order_database_rule"));
// 根据order_id分表,规则名称order_table_rule
result.setTableShardingStrategy(new
StandardShardingStrategyConfiguration("id", "order_table_rule"));
// order_id主键生成规则,规则名称snowflake
result.setKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("id", "snowflake"));
// result.setAuditStrategy(new
ShardingAuditStrategyConfiguration(Collections.singleton("sharding_key_required_auditor"),
true));
return result;
}
}
```
```java
Error starting ApplicationContext. To display the conditions report re-run
your application with 'debug' enabled.
2022-11-23 17:19:19.112 ERROR 14876 --- [ main]
o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'orderDAO' defined in file
[D:\MyProject\seata\seata\order\target\classes\com\example\order\dao\OrderDAO.class]:
Unsatisfied dependency expressed through constructor parameter 0; nested
exception is org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in
class path resource
[org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]:
Unsatisfied dependency expressed through method
'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'dataSource' defined in class path resource
[com/example/order/config/ShardingSphereJdbcConfiguration.class]: Bean
instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Fail
ed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw
exception; nested exception is java.lang.NullPointerException
at
org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
~[spring-context-5.3.23.jar:5.3.23]
at
org.springframework.context.support.AbstractApplicationContext.__refresh(AbstractApplicationContext.java:583)
~[spring-context-5.3.23.jar:5.3.23]
at
org.springframework.context.support.AbstractApplicationContext.jrLockAndRefresh(AbstractApplicationContext.java:41002)
~[spring-context-5.3.23.jar:5.3.23]
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:42008)
~[spring-context-5.3.23.jar:5.3.23]
at
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
~[spring-boot-2.7.5.jar:2.7.5]
at
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)
~[spring-boot-2.7.5.jar:2.7.5]
at
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
~[spring-boot-2.7.5.jar:2.7.5]
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
~[spring-boot-2.7.5.jar:2.7.5]
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
~[spring-boot-2.7.5.jar:2.7.5]
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
~[spring-boot-2.7.5.jar:2.7.5]
at com.example.OrderApplication.main(OrderApplication.java:14)
~[classes/:na]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in
class path resource
[org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]:
Unsatisfied dependency expressed through method
'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'dataSource' defined in class path resource
[com/example/order/config/ShardingSphereJdbcConfiguration.class]: Bean
instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to instantiate
[javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested
exception is java.lang.NullPointerException
at
org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
~[spring-beans-5.3.23.jar:5.3.23]
... 21 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'dataSource' defined in class path resource
[com/example/order/config/ShardingSphereJdbcConfiguration.class]: Bean
instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to instantiate
[javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested
exception is java.lang.NullPointerException
at
org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
~[spring-beans-5.3.23.jar:5.3.23]
... 37 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to
instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw
exception; nested exception is java.lang.NullPointerException
at
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
~[spring-beans-5.3.23.jar:5.3.23]
at
org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
~[spring-beans-5.3.23.jar:5.3.23]
... 51 common frames omitted
Caused by: java.lang.NullPointerException: null
at
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData.createDataSourceMetaDataMap(ShardingSphereResourceMetaData.java:64)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData.<init>(ShardingSphereResourceMetaData.java:53)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.createResourceMetaData(ShardingSphereDatabase.java:116)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:110)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:93)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory.createGenericDatabases(ShardingSphereDatabasesFactory.java:81)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory.create(ShardingSphereDatabasesFactory.java:69)
~[shardingsphere-infra-common-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:91)
~[shardingsphere-mode-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:69)
~[shardingsphere-mode-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.mode.manager.standalone.StandaloneContextManagerBuilder.build(StandaloneContextManagerBuilder.java:49)
~[shardingsphere-standalone-mode-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:76)
~[shardingsphere-jdbc-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:64)
~[shardingsphere-jdbc-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:93)
~[shardingsphere-jdbc-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:77)
~[shardingsphere-jdbc-core-5.2.1.jar:5.2.1]
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:137)
~[shardingsphere-jdbc-core-5.2.1.jar:5.2.1]
at
com.example.order.config.ShardingSphereJdbcConfiguration.dataSource(ShardingSphereJdbcConfiguration.java:37)
~[classes/:na]
at
com.example.order.config.ShardingSphereJdbcConfiguration$$EnhancerBySpringCGLIB$$1.CGLIB$dataSource$0(<generated>)
~[classes/:na]
at
com.example.order.config.ShardingSphereJdbcConfiguration$$EnhancerBySpringCGLIB$$1$$FastClassBySpringCGLIB$$1.invoke(<generated>)
~[classes/:na]
at
org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
~[spring-core-5.3.23.jar:5.3.23]
at
org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
~[spring-context-5.3.23.jar:5.3.23]
at
com.example.order.config.ShardingSphereJdbcConfiguration$$EnhancerBySpringCGLIB$$1.dataSource(<generated>)
~[classes/:na]
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:na]
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
~[na:na]
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
~[spring-beans-5.3.23.jar:5.3.23]
... 52 common frames omitted
```
--
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]