一。目的
在组内方便的切换主库和从库
二。具体做法
代码部分改动
1. 增加了一个注解DataSourceChange
public @interface DataSourceChange {
boolean fromSlave() default false;
}
2. 增加了MultipleDataSourceInterceptor
在这个函数里,利用AOP,将当前的DataSourceNameContextHolder 切换到从库上
主要需要关注的代码是
//为了减少影响面,目前只对×Service类里拥有DataSourceChange注解方法 进行AOP
private final static String EDP = "execution(@com.DataSourceChange * com" +
"..*Service.*(..))";
// 这是切换DataSourceNameContextHolder的部分代码
try {
if (fromSlave) {
DataSourceNameContextHolder.set(DataSourceNameConstant.SLAVE);
}
obj = joinPoint.proceed(args);
} catch (Throwable e) {
e.printStackTrace();
} finally {
if (fromSlave) {
DataSourceNameContextHolder.clear();
}
}
3.增加了一个Wrapper
将原来ProductDao的部分方法挪了出来,放在这里,使用方法
@DataSourceChange(fromSlave = true)
public List<String> getIncludeSupplierIds() {
return xxDao.getIncludeSupplierIds();
}
三。验证方法
打开spring连接transaction的日志,查看使用了哪个连接。
四。结论
1. 如何使用
如果想让某个由Spring管理的Service里的某个方法访问从库,只需要给Service加上注解 @DataSourceChange(fromSlave = true), 则这个Service里的方法会自动访问从库。(前提是,Service里的DAO是由spring+mybatis管理的).
譬如
@DataSourceChange(fromSlave = true)
public List<String> fooA() {
return xxx.fooA();
}
2. 不足
我尝试过,将这个注解加到DAO这一层,譬如
@Repository
public interface xxDao {
@DataSourceChange(fromSlave = true)
List<String> fooA();
}
启动时Spring会报错,提示 Could not generate CGLIB subclass of final class.
猜测原因可能是 mybatis 自动生成Mapper类时,使用了CGLIB。 但是在spring再对这个interface进行代理时,必须用JDK默认的proxy才行。。所以这里可能会有冲突。
还希望有别的同学能来指导具体的原因
如果这个service有@Transaction注解时,也不能使用这种方法。。。 这好像是Spring的一个bug,使用Transaction时,只会使用默认的dataSource
(已经由组内其他同事解决了。)
相关推荐
java spring 多数据源目前版本为mysql版本 利用spring aop 切面,自动切换数据源。
Spring多数据源配置,支持mysql、oracle等多个数据源同时存在的情况
Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis
基于注解的Spring多数据源配置和使用 前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备。由于之前做过的项目都是单数据源的,没有遇到这种场景,...
Spring多数据源配置_分布式数据 Tomcat服务器下的多数据源配置详情 一、环境及框架 Tomcat+spring+hibernate+jotm,还有就是struts、Oracle等 二、需求说明 系统里有2套不同网域的oracle数据库,之间的数据需要进行...
Spring 多数据源解决方案
基于SSI+Oracle架构的多数据源动态切换实例
Spring多数据源atomikos所有jar包,参照我上传Spring多数据源atomikos所有jar包.pdf,再加上这个jar包,就完美无缺了
spring多数据源的处理_mybatis实现跨库查询
spring多数据源,配置多个不同类型数据库。。内有说明文档。。
项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源。 spring多数据源 动态 创建 切换使用
使用注解配置Spring多数据源, spring + restlet + mysql 测试通过 OK,使用前请执行文件mysql_dml.sql中的sql以初始化测试数据
用于详细描述配置spring下多数据源动态切换方案的实施配置说明。可以自动切换数据源的配置。
由于网上的多数据源事务的帖子大多是2010年以前的,现在spring都已经到4.X了,有些类已经弃用了。 原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例那个类已经找不到了,所以我使用了atomikos。 ...
请自行修改com/resources/datasource.properties中数据库配置,Demo中配置的两个数据源,一个是Mysql,一个是Oracle。 运行之前请自行建立数据库的表。
NULL 博文链接:https://yangguowen.iteye.com/blog/2086104
spring 动态多数据源配置代码,本项目是maven项目,里面有完成的配资好的spring多数据源代码和配置文件。