SSH配置动态数据源

用到一个项目,需要整合2个不同的数据库!

现将代码贴下,以备后用:

1、创建静态映射类,该类映射动态数据源

Java代码
  1. public class DataSourceMap {
  2.      public static final String Analyse=”Analyse”;
  3.      public static final String DLmarket= “DLmarket”;
  4. }

2、创建数据库连接配置容器 类

Java代码
  1. public class DataSourceContextHolder {
  2.     private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  3.     public static void setCustomerType(String customerType){
  4.         contextHolder.set(customerType);
  5.     }
  6.     public static String getCustomerType() {
  7.         return contextHolder.get();
  8.     }
  9.     public static void clearCustomerType() {
  10.         contextHolder.remove();
  11.     }
  12. }

3、创建动态数据源切换类

Java代码
  1. public class DynamicDataSource extends AbstractRoutingDataSource{
  2.     @Override
  3.     protected Object determineCurrentLookupKey() {
  4.         // TODO Auto-generated method stub
  5.         String customerType=””;
  6.         if(DataSourceContextHolder.getCustomerType()!=null){
  7.             customerType = DataSourceContextHolder.getCustomerType().toString();
  8.         }
  9.         return customerType;
  10.     }
  11. }

该类继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法

4、在spring中配置多数据源

Xml代码
  1. <bean id=”analyseDataSource” class=”com.alibaba.druid.pool.DruidDataSource” init-method=”init” destroy-method=”close”>
  2. <property name=”url” value=”${jdbc_url}” />
  3. <property name=”username” value=”${jdbc_username}” />
  4. <property name=”password” value=”${jdbc_password}” />
  5. xxx…
  6. </bean>
  7. <bean id=”dlmarketDataSource” class=”com.alibaba.druid.pool.DruidDataSource” init-method=”init” destroy-method=”close”>
  8. <property name=”url” value=”${jdbc_url_dlmarket}” />
  9. <property name=”username” value=”${jdbc_username_dlmarket}” />
  10. <property name=”password” value=”${jdbc_password_dlmarket}” />
  11. xxx…
  12. <bean>
  13. <!– 多数据源的映射关系 –>
  14. <bean id=”dataSource” class=”com.current.util.DynamicDataSource”>
  15.     <property name=”targetDataSources”>
  16.     <map key-type=”java.lang.String”>
  17.     <!– key的值必须要和静态键值对照类中的值相同&nbsp; –>
  18.         <entry value-ref=”analyseDataSource” key=”Analyse”></entry>
  19.         <entry value-ref=”dlmarketDataSource” key=”DLmarket”></entry>
  20.     </map>
  21.     </property>
  22.     <property name=”defaultTargetDataSource” ref=”analyseDataSource”></property>
  23. </bean>

其他的SessionFactory   事务管理器配置都不需要修改。

5、在Action中切换数据源

Java代码
  1. public void getList(){
  2.         DataSourceContextHolder.setCustomerType(DataSourceMap.DLmarket);
  3.         int id=1;
  4.         List<Chaining> chainList = chainService.getList(id);
  5.         System.out.println(chainList.get(0).getChaining());
  6.     }

标签