Spring2连接多数据库,实现读写分离
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Spring2连接多数据库,实现读写分离
Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问2个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的流程如下:
一、建立一个获得和设置上下文的类
package com.lvye.base.dao.impl.jdbc;
/**连接哪个数据源的环境变量
* @author wenc
*/
public class JdbcContextHolder {
private static final ThreadLocal
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{
/* (non-Javadoc)
* @see org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#determineCurrentLook upKey()
* @author wenc
*/
@Override
protected Object determineCurrentLookupKey() {
return JdbcContextHolder.getJdbcType();
}
}
这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串。该方法中直接使用了JdbcContextHolder.getJdbcType();方法获得上下文环境并直接返回。
三、编写spring的配置文件配置数据源
class="boPooledDataSource" destroy-method="close">
class="boPooledDataSource" destroy-method="close"> wenhq?useUnicode=true&characterEncoding=utf-8
class="org.springframework.jdbc.core.JdbcTemplate">
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
在这个配置中可以看到首先配置两个真实的数据库连接,使用的msyql数据库;master和slave是按照mysql配置的主从关系的数据库,数据会自动实时同步。mySqlDataSource会根据上下文选择不同的数据源。
在这个配置中第一个property属性配置目标数据源,