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

前言:

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

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

首先大概介绍步骤:

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

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

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

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

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

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

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第1张图片

详细内容:

1.主从库的参数配置

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第2张图片

2.配置多个数据源

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第3张图片

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第4张图片

3.实现AbstractRoutingDataSource的determineCurrentLookupKey()方法

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

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

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

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第5张图片

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

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第6张图片

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

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第7张图片

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

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第8张图片

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

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

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

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第9张图片

6.测试效果

查询sql走的从库

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第10张图片

确认是从库信息

java mysql主从切换_动态切换主从数据源,实现读写分离最后一步!_第11张图片

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

生命不息,编程不止!

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

你可能感兴趣的:(java,mysql主从切换)