当前位置: 移动技术网 > IT编程>开发语言>Java > 动态切换主从数据源,实现读写分离最后一步!

动态切换主从数据源,实现读写分离最后一步!

2020年07月07日  | 移动技术网IT编程  | 我要评论

前言:

前篇已经搭好mysql主从实例及配置好主从复制功能。这篇实现应用层动态切换数据源,

完成读写分离功能最后一步。

 

首先大概介绍步骤:

1.已经有了单数据库的ssh应用,并且正常启动使用着。到这里的配置就不写了。

2.改造:配置主从数据库的properties参数

3.xml配置多个数据源,并关联到sqlSessionFactory

4.实现AbstractRoutingDataSource类的determineCurrentLookupKey()方法

5.定义DAO切面,调用切换数据源方法

 

数据源切换流程,建议下面看完再次看该图。

详细内容:

 

1.主从库的参数配置

 

2.配置多个数据源

 

 

3.实现AbstractRoutingDataSource的determineCurrentLookupKey()方法

该方法负责获取数据源ID,根据ID选择容器中初始化好的数据源。

dataSource_ID为数据源标识,值为dataSource_master和dataSource_slave1。

并且存放在本地线程中,避免并发问题。

 

该方法由AbstractRoutingDataSource的determineTargetDataSource()方法调用,获取自定义的数据源key后,从数据源容器中获取到相应数据源对象。

 

提供切换数据源方法,供DAO切面处使用。

 

4.定义DAO切面,查询走从库,其他走主库。

 

5.遇到问题:数据源选择方法总是先于DAO切面方法执行!也就是determineCurrentLookupKey方法先于切面前置方法执行。导致程序实际未切换数据源。

原因1:事务切点是在service层,而我的切点切到了DAO层。所以每次service层初始化数据源信息,执行DAO方法时才到切面的前置方法。

原因2:知道上面原因,把切点也改到service层,order顺序也设置了下优先,切面方法先于数据源初始化方法了。但是前置通知before获取到的方法是controller层的方法!我这是根据方法名字判断选择主从库的。好在环绕通知@Around方法获取的是当前service层方法名,所以就移到@Around方法中处理切换数据源!

 

6.测试效果

查询sql走的从库

 

确认是从库信息

 

同样方法测试主库也是一样。

生命不息,编程不止!

 

本文地址:https://blog.csdn.net/qq_34150524/article/details/107167913

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网