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

时间:2014-01-21 15:09:05

标签: java spring transactions spring-jdbc spring-transactions

我正在开发一个应用程序,其中我必须连接到不同的数据库,具体取决于从客户端传递的客户ID。所有数据库的模式都是相同的。它是一种多租户应用程序。由于我不知道有多少客户,我不能使用xml配置来静态创建数据源,因此我必须手动创建数据源。

我们使用Spring JdbcTemplate连接数据库,连接参数来自另一个保存应用程序配置的数据库。我能够正确连接到数据库,但方法调用不会发生在事务中。 以下是仅为一个数据库执行数据库连接的代码片段,我将为多个数据库扩展它:

BasicDataSource datasource = new BasicDataSource();
// set database connection params
....
// create jdbcTemplate, 
jdbcTemplate = new JdbcTemplate(datasource);
// create transaction managers
PlatformTransactionManager txManager = new DataSourceTransactionManager(datasource);

我的想法是手动创建事务管理器并以某种方式将其绑定到spring容器中,以便所有带有@Transactional注释的方法/类都可以使用此事务管理器。 我无法弄清楚如何绑定txManager,因此所有带@Transactional的方法/类都将使用此事务管理器。我不确定这是否是正确的方法,我应该为每个数据源创建一个事务管理器,因为,我不希望事务跨越多个数据库,但我希望每个服务方法调用都应该在事务中。 注意:我的所有服务类都有@Component和@Transactional注释。

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

2 个答案:

答案 0 :(得分:0)

我认为以下answer提供了您正在寻找的内容。否则,您将需要一个全局事务管理器。全局事务管理器将与JEE容器捆绑在一起,或者可以由诸如Atomikos之类的trnsaction管理器独立提供。 Spring documentation涵盖了两者

答案 1 :(得分:0)

你可以使用spring的AbstractRoutingDatasource。

请检查以下链接。解释了AbstractRoutingDatasource。这个数据库是根据所选语言动态更改的。

Spring AbstractRoutingDatasource