java—在spring中为不同的数据源重用相同的@transactional方法(jdbctemplate)

3duebb1j  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(296)

我们有相同的代码 service 方法将调用不同的 daos 每个都使用不同的 datasource (而且不同 JdbcTemplate s) 是的。我们想使用 @Transactional 注解,但据我所知,这个注解总是链接到一个特定的 TransactionManager (因此,对于一个特定的 DataSource ).
所以,我的问题是,有没有办法动态地选择 DataSource (或 TransactionManager )调用时使用 @Transactional 方法,以便我可以重用该方法来攻击不同的数据库?

k97glaaz

k97glaaz1#

这个 @Transactional 注解不允许对 value 属性,该属性选择 TransactionManager (可能是设计上的,至少看起来不会很快改变)。所以你不能有 @Transactional("#{@getTxManager}") 它将在呼叫时解析tx管理器。
在一些简单的情况下,您可能可以忽略以下几点,但是只有当您有一个主ds和一个仅在某些情况下使用的辅助ds时,才值得考虑。否则,您将在调用 foo/bar 到处都是,看起来一点都不干净

// TX boundary on the "top" abstraction layer
@Transactional("foo")
public void foo() {
    doWork();
}
@Transactional("bar")
public void bar() {
    doWork();
}

private void doWork() {
    // Work done here, no concern for tx management
}

对于像多租户这样更复杂的情况,如果您还没有考虑的话,abstractroutingdatasource是一个简单而健壮的选择。尽管这取决于你需要多少开关,它可能需要调整,甚至是不合适的。
最后,您可以创建自己的注解,动态地选择ds(虽然我不能保证),但这是最危险的方法,可能收益很小。

vktxenjb

vktxenjb2#

最安全的方法是为每个dao创建单独的服务。。。我不想调试这样的代码。请考虑维护此代码以及可能发生的故障。
如果我是你,我会问自己以下问题:
1.)为什么要分开dbs?
2)上下文不是有点混淆吗?也许在他们之间建立一些界限?
3.)我的查询真的需要是事务性的吗?
我可能不知道你的问题的来龙去脉,但对我来说,你似乎用一种错误的方式来建模你的应用程序,我会把重点放在它上面。

相关问题