790477691 opened a new issue, #23796:
URL: https://github.com/apache/shardingsphere/issues/23796

   ```text
   Exception in thread "main" Cannot create property=mode for 
JavaBean=org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration@1700915
    in 'reader', line 1, column 1:
       databaseName: oracleSource
       ^
   No single argument constructor found for class 
org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlModeConfiguration
    in 'reader', line 2, column 7:
       mode: standalone
             ^
   
        at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:321)
        at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:207)
        at 
org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:358)
        at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:270)
        at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:253)
        at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:207)
        at 
org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:191)
        at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:477)
        at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:443)
        at 
org.apache.shardingsphere.infra.util.yaml.YamlEngine.unmarshal(YamlEngine.java:55)
        at 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:61)
        at Test.main(Test.java:30)
   Caused by: org.yaml.snakeyaml.error.YAMLException: No single argument 
constructor found for class 
org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlModeConfiguration
        at 
org.yaml.snakeyaml.constructor.Constructor$ConstructScalar.construct(Constructor.java:417)
        at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:270)
        at 
org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:253)
        at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.newInstance(Constructor.java:333)
        at 
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:298)
        ... 11 more
   ```
   scratch.yaml
   ```text
   databaseName: oracleSource
   mode: standalone
   dataSources:
     oracleSource1:
       dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
       driverClassName: oracle.jdbc.driver.OracleDriver
       jdbcUrl: jdbc:oracle:thin:@***:***:road
       username: 111
       password: 1111
       connectionTimeoutMilliseconds: 30000
       idleTimeoutMilliseconds: 60000
       maxLifetimeMilliseconds: 1800000
       maxPoolSize: 50
       minPoolSize: 1
     oracleSource2:
       dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
       driverClassName: oracle.jdbc.driver.OracleDriver
       jdbcUrl: jdbc:oracle:thin:@***:***:road1
       username: 111
       password: 111
       connectionTimeoutMilliseconds: 30000
       idleTimeoutMilliseconds: 60000
       maxLifetimeMilliseconds: 1800000
       maxPoolSize: 50
       minPoolSize: 1
     oracleSource3:
       dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
       driverClassName: oracle.jdbc.driver.OracleDriver
       jdbcUrl: jdbc:oracle:thin:@***:***:road2
       username: 111
       password: 111
       connectionTimeoutMilliseconds: 30000
       idleTimeoutMilliseconds: 60000
       maxLifetimeMilliseconds: 1800000
       maxPoolSize: 50
       minPoolSize: 1
   
   rules:
       tables:
         MJM_GPS_RECORD:
           actualDataNodes: oracleSource${1..3}.MJM_GPS_RECORD
           databaseStrategy:
             standard:
               shardingColumn: TELEPHONE
               shardingAlgorithmName: hint_test
         MJM_JS_ATTACHMENT:
           actualDataNodes: oracleSource${1..3}.MJM_JS_ATTACHMENT
           databaseStrategy:
             standard:
               shardingColumn: SIM_NUMBER
               shardingAlgorithmName: hint_test
         MJM_JS_BLIND_AREA:
           actualDataNodes: oracleSource${1..3}.MJM_JS_BLIND_AREA
           databaseStrategy:
             standard:
               shardingColumn: SIM_NUMBER
               shardingAlgorithmName: hint_test
         MJM_JS_DRIVER_STATUS:
           actualDataNodes: oracleSource${1..3}.MJM_JS_DRIVER_STATUS
           databaseStrategy:
             standard:
               shardingColumn: SIM_NUMBER
               shardingAlgorithmName: hint_test
         MJM_JS_DRIVING_ASS:
           actualDataNodes: oracleSource${1..3}.MJM_JS_DRIVING_ASS
           databaseStrategy:
             standard:
               shardingColumn: SIM_NUMBER
               shardingAlgorithmName: hint_test
         MJM_WARNING:
           actualDataNodes: oracleSource${1..3}.MJM_WARNING
           databaseStrategy:
             standard:
               shardingColumn: SIM_NUMBER
               shardingAlgorithmName: hint_test
       bindingTables: 
MJM_GPS_RECORD,MJM_JS_ATTACHMENT,MJM_JS_BLIND_AREA,MJM_JS_DRIVER_STATUS,MJM_JS_DRIVING_ASS,MJM_WARNING
       broadcastTables: 
MJM_REPORT_LAST_POSITION,MJM_8702,T_SERVER_DB,T_GPS_RECORD_LOG_JOB,MJM_PICTURE_MATCH
   
       #    defaultDatabaseStrategy:
       #      hint:
       #        shardingColumn:
       #        shardingAlgorithmName: hint_test
       #    defaultTableStrategy:
       #      none:
   
       shardingAlgorithms:
         hint_test:
           type: HINT_TEST
   props:
     max-connections-size-per-query: 1
     kernel-executor-size: 16  # Infinite by default.
     proxy-frontend-flush-threshold: 128  # The default value is 128.
     proxy-hint-enabled: true
     sql-show: true
     check-table-metadata-enabled: false
   ```
   
   spring-datasource.xml
   ```text
   <?xml version="1.0" encoding="UTF-8"?>
   <beans xmlns="http://www.springframework.org/schema/beans";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xmlns:context="http://www.springframework.org/schema/context";
          
xmlns:sharding="http://shardingsphere.apache.org/schema/shardingsphere/sharding";
          xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/jdbc
          http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
          http://shardingsphere.apache.org/schema/shardingsphere/sharding
          
http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding.xsd";>
   
       <context:property-placeholder location="classpath:db.properties" 
ignore-unresolvable="true"/>
   
       <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
           <property name="slowSqlMillis" value="2000"/>
           <property name="logSlowSql" value="true"/>
       </bean>
   
   
       <bean id="dataSource" class="DynamicDataSource" >
           <property name="targetDataSources">
               <map>
                   <entry key="mysqlSource" value-ref="mysqlSource"/>
                   <entry key="mysqlSourceBj" value-ref="mysqlSourceBj"/>
                   <entry key="oracleSource" value-ref="oracleSource"/>
   <!--                <entry key="oracleSource" 
value-ref="shardingDataSource"/>-->
   <!--                <entry key="h2Source" value-ref="h2Source" />-->
               </map>
           </property>
           <property name="defaultTargetDataSource" ref="mysqlSource"/>
       </bean>
   
       <bean id="parentSource" class="com.alibaba.druid.pool.DruidDataSource">
           <!-- 配置获取连接等待超时的时间 -->
           <property name="maxWait" value="${jdbc.maxWait}"/>
           <!-- 初始大小 -->
           <property name="initialSize" value="${jdbc.initialSize}"/>
           <!-- 最小个数 -->
           <property name="minIdle" value="${jdbc.minIdle}"/>
           <!-- 最大个数 -->
           <property name="maxActive" value="${jdbc.maxActive}"/>
   
           <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
           <!--  
如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。-->
           <property name="poolPreparedStatements" value="false"/>
           <property name="maxPoolPreparedStatementPerConnectionSize" 
value="20"/>
   
           <property name="filters" value="${jdbc.filters}"/>
           <property name="timeBetweenEvictionRunsMillis" 
value="${jdbc.timeBetweenEvictionRunsMillis}"/>
           <property name="minEvictableIdleTimeMillis" 
value="${jdbc.minEvictableIdleTimeMillis}"/>
           <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
           <property name="testOnBorrow" value="${jdbc.testOnBorrow}"/>
           <property name="testOnReturn" value="${jdbc.testOnReturn}"/>
   
           <!-- 启用监控 -->
           <property name="proxyFilters">
               <list>
                   <ref bean="stat-filter"/>
               </list>
           </property>
           <property name="connectionProperties">
               <value>${jdbc.connproperty}</value>
           </property>
       </bean>
   
       <bean id="mysqlSource" parent="parentSource" init-method="init" 
destroy-method="close">
           <property name="driverClassName" value="${jdbc.driverClassName}"/>
           <property name="url" value="${jdbc.url}"/>
           <property name="username" value="${jdbc.username}"/>
           <property name="password" value="${jdbc.password}"/>
           <property name="validationQuery" value="select 1"/>
       </bean>
       <bean id="mysqlSourceBj" parent="parentSource" init-method="init" 
destroy-method="close">
           <property name="driverClassName" value="${jdbc.driverClassName1}"/>
           <property name="url" value="${jdbc.url1}"/>
           <property name="username" value="${jdbc.username1}"/>
           <property name="password" value="${jdbc.password1}"/>
           <property name="validationQuery" value="select 1"/>
       </bean>
       <bean id="oracleSource" parent="parentSource" init-method="init" 
destroy-method="close">
           <property name="driverClassName" 
value="org.apache.shardingsphere.driver.ShardingSphereDriver"/>
           <property name="url" 
value="jdbc:shardingsphere:classpath:scratch.yaml" />
       </bean>
   
   </beans>
   ```
   DynamicDataSource
   ```text
   import com.alibaba.druid.pool.DruidDataSource;
   import com.alibaba.druid.pool.DruidPooledConnection;
   import org.springframework.core.annotation.Order;
   import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
   
   import java.sql.SQLException;
   import java.util.logging.Logger;
   
   @Order(2)
   public class DynamicDataSource extends AbstractRoutingDataSource  {
   
       /**
        * 取得当前使用那个数据源。
        */
       @Override
       protected Object determineCurrentLookupKey() {
           return DataSourceContextHolder.getDbType();
       }
   
       public Logger getParentLogger() {
           // TODO Auto-generated method stub
           return null;
       }
   
   }
   
   ```
   DataSourceContextHolder
   ```text
   
   public class DataSourceContextHolder {
   
       /**
        * 默认数据源
        */
       public static final String DEFAULT_DS = DataSourceConst.MYSQL_SOURCE;
   
   
       /**
        * 数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰
        */
       private static final ThreadLocal<String> contextHolder = new 
ThreadLocal<String>();
   
       /**
        * 设置当前数据库。
        * @param dbType
        */
       public static void setDbType(String dbType)
       {
           contextHolder.set(dbType);
       }
   
       /**
        * 取得当前数据源。
        * @return
        */
       public static String getDbType() {
           if (contextHolder.get() == null){
               return DEFAULT_DS;
           }else {
               return (String) contextHolder.get();
           }
       }
   
       /**
        * 清除上下文数据
        */
       public static void clearDbType()
       {
           contextHolder.remove();
       }
   }
   
   ```
   


-- 
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