我有 2 个数据源,即 dataSourceA
和 dataSourceB
,但基于一些计算,我需要在不同的架构中执行相同的查询。此外,它将在任一模式中执行。
所以,在 DAO 层,我有一个 setDataSource()
方法,它是 @autowired
到 dataSourceA
,从而返回 JDBCTemplate与以前的数据源。如何使用相同的 JDBCTemplate 实现 dataSourceB
更改,因为需要更改整个应用程序,因此很难在每个 DAO 层进行更改。
最佳答案
您可以注入(inject)两个数据源并根据您的逻辑在方法中选择数据源:
public class SomeDaoImpl implements SomeDao {
private final JdbcTemplate jdbcTemplateA;
private final JdbcTemplate jdbcTemplateB;
@Autowired
public SomeDaoImpl(JdbcTemplate jdbcTemplateA, JdbcTemplate jdbcTemplateB) {
// injecting both JdbcTemplate instances
this.jdbcTemplateA = jdbcTemplateA;
this.jdbcTemplateB = jdbcTemplateB;
}
public void businessLogicMethod(...) {
// choosing the actual template to be used according to your logic
JdbcTemplate jdbcTemplate = chooseTemplate(...);
// now using the template to execute a query
jdbcTemplate.execute(...);
}
}
另一种选择是实例化两个 SomeDaoImpl
实例,并向每个实例注入(inject)一个 JdbcTemplate
,然后在服务层中选择 DAO 实例。
但这两种解决方案都有一个缺陷:事务通常在服务层启动(例如使用拦截器),并且它不知道您要将请求路由到另一个数据源;因此,可能会发生事务在一个数据源上启动,但查询在另一个数据源上执行的情况。
因此,最清晰的解决方案是向上一级并实例化 2 个服务,其中每个 DAO 都具有不同的 JdbcTemplate
实例。当然,必须配置并仔细连接 2 个事务管理器(例如,通过 @Transactional("transactionManagerA") )。有关此的更多信息,请访问 Spring - Is it possible to use multiple transaction managers in the same application?
关于java - 对两个不同的模式使用相同的 jdbcTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45543266/