【问题标题】:Using same jdbcTemplate for two different schemas对两个不同的模式使用相同的 jdbcTemplate
【发布时间】:2018-01-14 13:04:24
【问题描述】:

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

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

【问题讨论】:

  • 为什么不在查询中使用架构名称,而不是在数据源中定义架构名称?
  • 通过这个链接。没有确切的答案,但您可能会有所了解。 zetcode.com/articles/springbootqualifier

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


【解决方案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 个服务,每个服务中的 DAO 具有不同的 JdbcTemplate 实例。当然,必须配置和仔细连接 2 个事务管理器(例如,通过@Transactional("transactionManagerA"))。更多信息请点击此处Spring - Is it possible to use multiple transaction managers in the same application?

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多