我正在开发一个应用程序,其中我必须根据从客户端传递的客户 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 注释。
我是否以正确的方式解决问题?
我认为以下answer https://stackoverflow.com/questions/14837601/multi-tenancy-with-spring-hibernate-sessionfactory-configured-for-multi-tena提供您正在寻找的东西。否则,您将需要一名全球事务经理。全局事务管理器将与 JEE 容器捆绑在一起,或者可以由 Atomikos 等事务管理器独立提供。这Spring文档 http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#transaction-global涵盖两者
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)