对AbstractRoutingDataSource的误解

本文探讨了在Spring框架下使用AbstractRoutingDataSource进行多数据源路由的局限性,特别是在事务处理方面的问题。指出该方法更适合一业务一数据源场景,对于一业务多数据源情况,建议采用分包管理及Atomikos+jta方案。

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

AbstractRoutingDataSource对象是spring中对多数据源实现路由功能的一个类,从名字上很容易想到在多数据源中的应用,但这里依然有个坑需要注意,就是对多数据源的使用场景。不是任何场景都适合。笔者也是在使用中遇到了问题,在网上查了很多资料。发现和我有同样问题的人不少。特将对它的理解写在此处,以备日后使用。如有不对地方还请高人指正。

一般我们在实际中对多数据源的使用都是在Service层调用Dao层,而最佳实践经验是分包管理数据源,在Service层调用多个不同数据源的Dao对象,来完成一个业务,这通常都需要事务来处理数据一致性问题。而使用AbstractRoutingDataSource来管理数据源的问题就出现在了事务上,我们知道事务也是需要配置数据源的。如果我们要用AbstractRoutingDataSource来实现数据源的切换,在事务面前是无能为力的。这主要是因为一般我们的事务是以AOP的方式切在我们业务方法之前的,并且是通过获取Connection对象来实现的(这应该是事务的通用方式),而事务本身也包含数据源,恰好和从AbstractRoutingDataSource对象中切换数据源的时机重合,就是调用determineTargetDataSource方法,这也是我们实现AbstractRoutingDataSource类唯一要覆盖的方法。所以在连接池的环境下,就导致由事务创建了链接也就是调用了determineTargetDataSource方法。如果我们要向切换数据源就必须要在事务之前完成,但这就无法实现在事务中使用多数据源了。
总结,AbstractRoutingDataSource只适用于多数据源中一业务一数据源的情况。如果是一业务多个数据源,还是老老实实的分包,分SessionFactory吧。这样可以用Atomikos+jta来实现数据的一致性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值