<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p>
讯享网
不要急于复制代码,先看清业务思路是否符合你要的,以下:
- Springboot项目
- 一个主数据源,数据库名称不变。
- 一个副数据源,数据库名称每天都在变,比如今天1号,是db_01; 明天2号,是db_02。
- 需要项目持续运行,不能切换数据源就重启项目。
- 副数据源在切换数据源时要考虑到还有sql在运行,切换数据源后要做防错。简而言之,就是要定时扫描一下之前的数据库是否存在没有操作完的数据做一下补救。
- 这部分根据实际项目而定,做好了这部分,实际上有关多数据源的事务一致性问题,你完全可以根据我上面的思路进行设计,而不是专注于一定要在代码层面实现多数据源操作的一致性,而是通过业务思路设计实现。
- 多数据源如何配置。
以前的写老项目程序员不知道怎么想的,一个月变一个数据库名称,一天变一个表。他是省事了,后期数据对接的人头大。
我项目的原始逻辑相当复杂,下面我们模拟一个业务需求来展开。
- 一个springboot项目,主数据源main_db,副数据源change_db_* ,没看错,它就是*。副数据源名称可变的。副数据源change_db_* 向主数据源main_db同步导入数据。
- 当调用接口1,我们查看主数据源main_db里的导入的数据;
- 当调用接口2,我们使用当前已连接的副数据源change_db_*插入数据;
- 当调用接口3,我们使用当前已连接的副数据源change_db_*向主数据源main_db里导入数据;
- 当调用接口4,我们切换副数据源change_db_为副数据源change_db_,当再调用接口3时数据源已经变了。
- 数据库如下:

讯享网
- 新建springboot项目通过idea或者官网生成springboot项目都可以,不再赘述。
目录结构如下
- pom文件配置
讯享网
3.yml文件配置
#数据库配置
讯享网
4.2数据源1配置,注意主数据源使用 @Primary注解;使用@DependsOn注解解决循环依赖问题; sessionFactoryBean.setVfs(SpringBootVFS.class)这句代码解决加载springboot虚拟文件,防止jar包启动时找不到类;

4.3数据源2
讯享网
4.4数据源2配置
5.SpringUtil工具类。实现ApplicationContextAware,在项目启动后使用ApplicationContext获取数据源bean。
讯享网
6.核心方法:
调用接口时切换数据源。启动时副数据源是change_db_,调用接口后副数据源切换为change_db_。
我演示用的是写死的,实际使用中可以把根据时间变化的数据源放在数据库或者配置文件中,来获取。
重点:
许多博客都写错了。我们并不能使用.close()方法直接关闭数据源,然后使用.restart()重新加载数据源配置,因为此时数据源往往已经调用过.init()方法,.isInited()为true,此时使用.setXX会报错。
正确的使用:
先判断.isInited()是否为true,如果为true,则调用.restart()方法,此时.isInited()为false,我们调用.setXX可以修改数据源属性,然后再调用.init()方法重新加载数据源。
1.查看主数据源数据
讯享网
此时为空。

2.向当前副数据源插入数据。


3.副数据库向主数据库插入数据
讯享网


4.查看当前主数据源数据


5.调用接口切换副数据源change_db_→change_db_。
讯享网

6.使用新副数据源插入数据。


6.新副数据库向主数据库插入数据


7.查看此时主数据源数据


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/149148.html