我们有相同的代码 service
方法将调用不同的 daos
每个都使用不同的 datasource
(而且不同 JdbcTemplate
s) 是的。我们想使用 @Transactional
注解,但据我所知,这个注解总是链接到一个特定的 TransactionManager
(因此,对于一个特定的 DataSource
).
所以,我的问题是,有没有办法动态地选择 DataSource
(或 TransactionManager
)调用时使用 @Transactional
方法,以便我可以重用该方法来攻击不同的数据库?
2条答案
按热度按时间k97glaaz1#
这个
@Transactional
注解不允许对value
属性,该属性选择TransactionManager
(可能是设计上的,至少看起来不会很快改变)。所以你不能有@Transactional("#{@getTxManager}")
它将在呼叫时解析tx管理器。在一些简单的情况下,您可能可以忽略以下几点,但是只有当您有一个主ds和一个仅在某些情况下使用的辅助ds时,才值得考虑。否则,您将在调用
foo/bar
到处都是,看起来一点都不干净对于像多租户这样更复杂的情况,如果您还没有考虑的话,abstractroutingdatasource是一个简单而健壮的选择。尽管这取决于你需要多少开关,它可能需要调整,甚至是不合适的。
最后,您可以创建自己的注解,动态地选择ds(虽然我不能保证),但这是最危险的方法,可能收益很小。
vktxenjb2#
最安全的方法是为每个dao创建单独的服务。。。我不想调试这样的代码。请考虑维护此代码以及可能发生的故障。
如果我是你,我会问自己以下问题:
1.)为什么要分开dbs?
2)上下文不是有点混淆吗?也许在他们之间建立一些界限?
3.)我的查询真的需要是事务性的吗?
我可能不知道你的问题的来龙去脉,但对我来说,你似乎用一种错误的方式来建模你的应用程序,我会把重点放在它上面。