229037600 发表于 2017-9-9 14:56:29

多数据源的问题

在spring-mvc-hibernate.xml里已经配置另外一个数据源:
<!-- 引入属性文件 -->
      <context:property-placeholder location="classpath:dbconfig.properties" />
      <!-- 配置数据源1 -->
      <bean id="dataSource_jeecg" name="dataSource_jeecg" class="com.alibaba.druid.pool.DruidDataSource"
                init-method="init" destroy-method="close">
                <property name="url" value="${jdbc.url.jeecg}" />
                <property name="username" value="${jdbc.username.jeecg}" />
                <property name="password" value="${jdbc.password.jeecg}" />
                <!-- 初始化连接大小 -->
                <property name="initialSize" value="0" />
                <!-- 连接池最大使用连接数量 -->
                <property name="maxActive" value="2000" />
                <!-- 连接池最大空闲 -->
                <property name="maxIdle" value="20" />
                <!-- 连接池最小空闲 -->
                <property name="minIdle" value="5" />
                <!-- 获取连接最大等待时间 -->
                <property name="maxWait" value="60000" />
                <!--
                <property name="poolPreparedStatements" value="true" />
                <property name="maxPoolPreparedStatementPerConnectionSize" value="33" />
                -->
                <property name="validationQuery" value="${validationQuery.sqlserver}" />
                <property name="testOnBorrow" value="false" />
                <property name="testOnReturn" value="false" />
                <property name="testWhileIdle" value="true" />

                <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
                <property name="timeBetweenEvictionRunsMillis" value="60000" />
                <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
                <property name="minEvictableIdleTimeMillis" value="25200000" />

                <!-- 打开removeAbandoned功能 -->
                <property name="removeAbandoned" value="true" />
                <!-- 1800秒,也就是30分钟 -->
                <property name="removeAbandonedTimeout" value="1800" />
                <!-- 关闭abanded连接时输出错误日志 -->
                <property name="logAbandoned" value="true" />

                <!-- 开启Druid的监控统计功能 -->
                <property name="filters" value="stat" />
                <!--<property name="filters" value="mergeStat" /> -->
                <!-- Oracle连接是获取字段注释 -->
                <property name="connectProperties">
                        <props>
                              <prop key="remarksReporting">true</prop>
                        </props>
                </property>
      </bean>
                <!-- 引入属性文件 -->
      <context:property-placeholder location="classpath:dbconfig2.properties" />
      <bean id="dataSource_jeecg2" name="dataSource_jeecg2" class="com.alibaba.druid.pool.DruidDataSource"
                init-method="init" destroy-method="close">
                <property name="url" value="${jdbc.url.jeecg}" />
                <property name="username" value="${jdbc.username.jeecg}" />
                <property name="password" value="${jdbc.password.jeecg}" />
                <!-- 初始化连接大小 -->
                <property name="initialSize" value="0" />
                <!-- 连接池最大使用连接数量 -->
                <property name="maxActive" value="2000" />
                <!-- 连接池最大空闲 -->
                <property name="maxIdle" value="20" />
                <!-- 连接池最小空闲 -->
                <property name="minIdle" value="5" />
                <!-- 获取连接最大等待时间 -->
                <property name="maxWait" value="60000" />
                <!--
                <property name="poolPreparedStatements" value="true" />
                <property name="maxPoolPreparedStatementPerConnectionSize" value="33" />
                -->
                <property name="validationQuery" value="${validationQuery.sqlserver}" />
                <property name="testOnBorrow" value="false" />
                <property name="testOnReturn" value="false" />
                <property name="testWhileIdle" value="true" />

                <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
                <property name="timeBetweenEvictionRunsMillis" value="60000" />
                <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
                <property name="minEvictableIdleTimeMillis" value="25200000" />

                <!-- 打开removeAbandoned功能 -->
                <property name="removeAbandoned" value="true" />
                <!-- 1800秒,也就是30分钟 -->
                <property name="removeAbandonedTimeout" value="1800" />
                <!-- 关闭abanded连接时输出错误日志 -->
                <property name="logAbandoned" value="true" />

                <!-- 开启Druid的监控统计功能 -->
                <property name="filters" value="stat" />
                <!--<property name="filters" value="mergeStat" /> -->
                <!-- Oracle连接是获取字段注释 -->
                <property name="connectProperties">
                        <props>
                              <prop key="remarksReporting">true</prop>
                        </props>
                </property>
      
      </bean>
      
      <!-- 数据源集合 -->
      <bean id="dataSource"
                class="org.jeecgframework.core.extend.datasource.DynamicDataSource">
                <property name="targetDataSources">
                        <map key-type="org.jeecgframework.core.extend.datasource.DataSourceType">
                              <entry key="dataSource_jeecg" value-ref="dataSource_jeecg" />
                              <entry key="dataSource_jeecg2" value-ref="dataSource_jeecg2" />
                              <!-- <entry key="mapdataSource" value-ref="mapdataSource" /> -->
                        </map>
                </property>
                <property name="defaultTargetDataSource" ref="dataSource_jeecg" />
      </bean>
枚举类已经添加新的数据源类型:
public enum DataSourceType {
      dataSource_jeecg,dataSource_enter,dataSource4,mapdataSource,dataSource_jeecg2
}

DataSourceContextHolder 类:
public class DataSourceContextHolder {

      private static final ThreadLocal<DataSourceType> contextHolder=new ThreadLocal<DataSourceType>();
      
      public static void setDataSourceType(DataSourceType dataSourceType){
                contextHolder.set(dataSourceType);
      }
      
      public static DataSourceType getDataSourceType(){
               
                return (DataSourceType) contextHolder.get();
      }
      
      public static void clearDataSourceType(){
                contextHolder.remove();
      }
      
}


DynamicDataSource 类:
public class DynamicDataSource extends AbstractRoutingDataSource {

      /*
         * 该方法必须要重写方法是为了根据数据库标示符取得当前的数据库
         */
      
      protected Object determineCurrentLookupKey() {
                DataSourceType dataSourceType= DataSourceContextHolder.getDataSourceType();
               
                return dataSourceType;
      }

      
      public void setDataSourceLookup(DataSourceLookup dataSourceLookup) {
                super.setDataSourceLookup(dataSourceLookup);
      }

      
      public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
                super.setDefaultTargetDataSource(defaultTargetDataSource);
      }

      
      public void setTargetDataSources(Map targetDataSources) {
                super.setTargetDataSources(targetDataSources);
      }

}

dbconfig2.properties和dbconfig.properties里分别为:

hibernate.dialect=org.hibernate.dialect.OracleDialect
validationQuery.sqlserver=SELECT 1 FROM DUAL
jdbc.url.jeecg=jdbc:oracle:thin:@192.168.0.250:1521:orcl
jdbc.username.jeecg=eeim_ln
jdbc.password.jeecg=fxkj1501
jdbc.dbType=oracle

hibernate.dialect=org.hibernate.dialect.OracleDialect
validationQuery.sqlserver=SELECT 1 FROM DUAL
jdbc.url.jeecg=jdbc:oracle:thin:@192.168.0.250:1521:orcl
jdbc.username.jeecg=hr_tl
jdbc.password.jeecg=fxkj1501
jdbc.dbType=oracle

两个数据信息。
为什么在测试类里进入业务查询调用DataSourceContextHolder.setDataSourceType(DataSourceType.dataSource_jeecg2);缺切换不了数据库,求大神解答~!感激不尽~!


akacd 发表于 2018-4-25 13:30:43

顶起来

admin 发表于 2018-4-25 13:41:44

我们不建议这么模式
页: [1]
查看完整版本: 多数据源的问题