动态切换主从数据源,实现读写分离最后一步!
前言:
前篇已经搭好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
上一篇: Chapter 1 - 数据库和SQL