我有2个数据源说dataSourceA
和dataSourceB
,但基于几个计算,我需要在不同的模式中执行相同的查询。此外,它将在任一模式中执行。
所以,在DAO层,我有一个setDataSource()
方法@autowired
dataSourceA
,因此,返回JDBCTemplate与前DataSource。如何使用相同的JDBCTemplate实现dataSourceB
更改,因为在每个DAO层都很难更改,因为需要进行整个应用程序更改。
答案 0 :(得分:1)
您可以根据逻辑注入两个数据源并在方法中选择数据源:
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
实例并在每个实例中注入一个JdbcTemplate
,然后在服务层中选择DAO实例。
但是这两种解决方案都有一个缺陷:事务通常在服务层(例如拦截器)中启动,并且它不知道您要将请求路由到另一个数据源;因此,事件可能发生在一个数据源上,但查询是在另一个数据源上执行的。
因此,最明智的解决方案是升级一级并实例化2个服务,在每个服务中具有不同JdbcTemplate
个实例的DAO。当然,必须配置2个事务管理器并仔细连接(例如,通过@Transactional("transactionManagerA")
)。有关详细信息,请访问Spring - Is it possible to use multiple transaction managers in the same application?