java - Spring:用于只读事务的单独数据源

标签 java spring transactions ibatis

感谢阅读本文。

我有 2 个 MySQL 数据库 - master 用于写入,slave 用于读取。我想象的完美场景是我的应用程序使用连接到 master 进行 readOnly=false 事务,slave 进行 readOnly=true 事务。

为了实现这一点,我需要根据当前交易的类型提供有效的连接。我的数据服务层应该不知道它使用什么类型的连接,直接使用注入(inject)的SqlMapClient(我用的是iBatis)。这意味着(如果我做对了)注入(inject)的 SqlMapClient 应该被代理,并且应该在运行时选择委托(delegate)。

public class MyDataService {

    private SqlMapClient sqlMap;

    @Autowired
    public MyDataService (SqlMapClient sqlMap) {
        this.sqlMap = sqlMap;
    }

    @Transactional(readOnly = true)
    public MyData getSomeData() {
        // an instance of sqlMap connected to slave should be used
    }

    @Transactional(readOnly = false)
    public void saveMyData(MyData myData) {
        // an instance of sqlMap connected to master should be used
    }
}

所以问题是 - 我该怎么做?

非常感谢

最佳答案

这是一个有趣的想法,但您手上的工作很艰巨。 readOnly 属性旨在作为对事务管理器的提示,并没有真正在任何有意义的地方进行咨询。您必须重写或扩展多个 Spring 基础结构类。

因此,除非您一心想让它按您想要的方式工作,否则您最好的选择几乎肯定是将两个单独的 SqlMapClient 对象注入(inject)到您的 DAO 中,并选择合适的方法一。 @Transactional 注释还需要指明要使用哪个事务管理器(假设您使用的是 DataSourceTransactionManager 而不是 JpaTransactionManager),注意将事务管理器与 SqlMapClient 使用的 DataSource 相匹配。

关于java - Spring:用于只读事务的单独数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3280987/

相关文章:

java - android SDK中的FFT库

spring - Jpa规范执行器: complex queries with specifications

java - 使用 Kotlin 的 RSocket retrieveFlux()

MySQL - 在嵌入式程序的情况下回滚事务

java - 如果我已经在使用@Transactional,我应该什么时候使用entityManager.flush()

java - 如何将int数组转换为int

java - 使用 Jackson 解码和反序列化其值为 Base64 编码、字符串化 JSON blob 的字段的最简单方法

java - Spring REST 服务证书身份验证

c# - NHibernate事务提交,什么会提交到数据库?

hibernate - 为什么有不同类型的事务管理器?