欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-14 13:39:59
前言:前篇已经搭好mysql主从实例及配置好主从复制功能。这篇实现应用层动态切换数据源,完成读写分离功能最后一步。首先大概介绍步骤:1.已经有了单数据库的ssh应用,并且正常启动使用着。到这里的配置就不写了。2.改造:配置主从数据库的properties参数3.xml配置多个数据源,并关联到sqlSessionFactory4.实现AbstractRoutingDataSource类的determineCurrentLookupKey()方法5.定义DAO切面,调用切换....

前言:

前篇已经搭好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