我正在开发一个应用程序,在该应用程序中,我必须连接到不同的数据库,这取决于从客户端传递的客户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容器中,这样所有带有@ transaction注释的方法/类都可以使用该事务管理器。我不知道如何绑定txManager,这样所有带有@ transaction的方法/类都会使用这个事务管理器。我不确定这是否是正确的方式,也不确定我是否应该为每个数据源创建一个事务管理器,因为我不希望事务跨越多个数据库,但我希望每个服务方法调用都应该在一个事务中。注意:我的所有服务类都有@Component和@Transactional注释。
我用正确的方式解决问题了吗?
发布于 2014-01-22 10:23:07
我认为下面的answer提供了你想要的东西。否则,您将需要一个全局事务管理器。全局事务管理器将与JEE容器捆绑在一起,也可以由事务管理器(如Atomikos )独立提供。Spring documentation涵盖了这两种情况
发布于 2014-01-22 12:23:59
您可以使用弹簧的AbstractRoutingDatasource。
请检查下面的链接。explained.Here数据库的AbstractRoutingDatasource是根据选择的语言动态更改的。
Spring AbstractRoutingDatasource
https://stackoverflow.com/questions/21261869
复制相似问题