对两个不同的模式使用相同的jdbcTemplate

时间:2017-08-07 09:11:44

标签: java spring spring-boot spring-jdbc jdbctemplate

我有2个数据源说dataSourceAdataSourceB,但基于几个计算,我需要在不同的模式中执行相同的查询。此外,它将在任一模式中执行。

所以,在DAO层,我有一个setDataSource()方法@autowired dataSourceA,因此,返回JDBCTemplate与前DataSource。如何使用相同的JDBCTemplate实现dataSourceB更改,因为在每个DAO层都很难更改,因为需要进行整个应用程序更改。

1 个答案:

答案 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?