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

标签 java spring spring-boot spring-jdbc jdbctemplate

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

所以,在 DAO 层,我有一个 setDataSource() 方法,它是 @autowireddataSourceA,从而返回 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/

相关文章:

angular - SyntaxError : Unexpected token < in JSON at position 0 at JSON. 解析 (<匿名>) 在 XMLHttpRequest.onLoad

java - 从字节数组转换和显示图像

spring - 使用 <util :properties> in spring 3 加载多个属性文件

java - Grails Spring 安全认证提供程序和自定义过滤器

java - Spring 无法自动注入(inject)构造函数参数

java - Spring-boot 数据源提交问题

java - 对基本框架类进行子类化是否安全?

java - 如何在 Java 中使用 REST-assured 上传 CSV 文件?

java - MVC 和 Java 与更严格的 MVC 语言相比

java - 对于大型项目,Spring Data JPA 与 Hibernate 有何不同?