spring主从查询AOP切换数据源

本文介绍如何在Spring项目中使用AOP和AbstractRoutingDataSource类动态切换主从数据源,以减轻主库压力并提高系统稳定性。通过自定义注解和ThreadLocal实现查询时的数据源选择,避免重复编写接口,简化代码维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前有个项目最近整理出来共享给大家。

公共查询服务,公司查询场景越来越多,主库压力越来越大,一些非实时数据通过查询丛库数据来减少主库的压力,也防止主库出现故障导致网站不可访问而出现的崩溃。

在一个项目里面配置主从数据源进行查询,考虑最原始的方案就是通过不同的sessionFactory指向不同的数据源进行数据源切换查询。发现如果后面修改接口或者添加接口就需要写双份和改双份,这是非常不方便的。最后发现了spring下面的org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource类:

通过getConnection()方法获取连接-->通过determineTargetDataSource()方法获取DataSource数据源-->通过determineCurrentLookupKey获取数据源在resolvedDataSources这个map里面存在的数据源连接-->resolvedDataSources主要是获取targetDataSources里面的数据源配置

AbstractRoutingDataSource源码如下:

恍然大悟可以通过继承AbstractRoutingDataSource类,重写determineCurrentLookupKey方法获取数据源的key。

下面就改AOP上场了,通过@Around("@annotation(dataSourceSelect)")拦截执行方法上面有@dataSourceSelect注解获取注解里面的值,把值存放到ThreadLocal-->LinkedList里面,查询的时候调用重写后的determineCurrentLookupKey方法获取LinkedList的第一个元素,这样执行查询的时候数据源就完成切换了。@Around最后通过poll清楚LinkedList的头部的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值