日期:2014-05-16  浏览次数:20444 次

Spring2连接多数据库
Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承 AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问2个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的流程如下:

一、建立一个获得和设置上下文的类

package com.lvye.base.dao.impl.jdbc;

/**连接哪个数据源的 环境变量*/

public class JdbcContextHolder {

       private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 

       public static void setJdbcType(String jdbcType) { 

             contextHolder.set(jdbcType);  

       }  

       public static void setSlave(){

             setJdbcType("slave");

       }

       public static void setMaster(){

              clearJdbcType();

       }

       public static String getJdbcType() { 

            return (String) contextHolder.get();  

       }  

       public static void clearJdbcType() { 

            contextHolder.remove();  

       }  

}

二、建立动态数据源类,这个类必须继承AbstractRoutingDataSource

package com.lvye.base.dao.impl.jdbc;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

public class DynamicDataSource extends AbstractRoutingDataSource{

       protected Object determineCurrentLookupKey() {

              return JdbcContextHolder.getJdbcType();

       }

}

这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串。该方法中直接 使用了JdbcContextHolder.getJdbcType();方法获得上下文环境并直接返回。

三、编写spring的配置文件配置数据源

<beans>

       <bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource"  destroy-method="close">

              <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property>

              <property name="jdbcUrl">

                     <value>jdbc:mysql://192.168.18.143:3306/wenhq?useUnicode=true&amp;characterEncoding=utf-8</value>

              </property>

              <property name="user"><value>root</value></property>

              <property name="password"><value></value></property>

       </bean>

        <bean id="slave" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

     &nbs