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