Java 手动创建的多个数据源的事务管理

Java 手动创建的多个数据源的事务管理,java,spring,transactions,spring-jdbc,spring-transactions,Java,Spring,Transactions,Spring Jdbc,Spring Transactions,我正在开发一个应用程序,其中我必须根据从客户端传递的客户id连接到不同的数据库。所有数据库的架构都是相同的。它是一种多租户应用程序。由于我不知道会有多少客户,我无法使用xml配置静态创建数据源,因此我必须手动创建数据源 我们使用SpringJDBCTemplate连接到数据库,连接参数来自另一个保存应用程序配置的数据库。我能够正确地连接到数据库,但方法调用不会在事务中发生。 以下是只对一个数据库进行数据库连接的代码段,我打算对多个数据库进行扩展: BasicDataSource datasour

我正在开发一个应用程序,其中我必须根据从客户端传递的客户id连接到不同的数据库。所有数据库的架构都是相同的。它是一种多租户应用程序。由于我不知道会有多少客户,我无法使用xml配置静态创建数据源,因此我必须手动创建数据源

我们使用SpringJDBCTemplate连接到数据库,连接参数来自另一个保存应用程序配置的数据库。我能够正确地连接到数据库,但方法调用不会在事务中发生。 以下是只对一个数据库进行数据库连接的代码段,我打算对多个数据库进行扩展:

BasicDataSource datasource = new BasicDataSource();
// set database connection params
....
// create jdbcTemplate, 
jdbcTemplate = new JdbcTemplate(datasource);
// create transaction managers
PlatformTransactionManager txManager = new DataSourceTransactionManager(datasource);
我的想法是手动创建事务管理器,并以某种方式将其绑定到spring容器中,以便所有带有@Transactional annotation的方法/类都可以使用此事务管理器。 我无法确定如何绑定txManager,以便所有带有@Transactional的方法/类都将使用此事务管理器。我不确定这是否正确,我是否应该为每个数据源创建一个事务管理器,因为我不希望事务跨越多个数据库,但我希望每个服务方法调用都应该在一个事务中。 注意:我的所有服务类都有@Component和@Transactional注释


我是否以正确的方式解决了问题?

我认为以下内容提供了您需要的内容。否则,您将需要一个全局事务管理器。全局事务管理器将与JEE容器捆绑在一起,或者可以由TrnAction管理器(如Atomikos)独立提供。覆盖了这两个方面,您可以使用spring的AbstractRoutingDatasource

请查看下面的链接。解释了AbstractRoutingDatasource。这里数据库根据所选语言动态更改


可能重复@PradeepKrKaushal,谢谢你的评论,但我在发布之前看到了这个问题。使用TransactionTemplate对我来说不是一个有效的选择,因为我在我的serivce类中使用了很多方法,所有这些方法都必须使用TransactionTemplate进行包装。我正在寻找一个类似于公认答案第3段中提到的解决方案,但找不到如何解决。