Spring:用于只读事务的独立数据源

art*_*emb 8 java spring ibatis transactions

感谢您阅读本文.

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

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢

ska*_*man 4

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

因此,除非您一心想要让这项工作按您的意愿进行,否则您最好的选择几乎肯定是SqlMapClient向您的 DAO 中注入两个单独的对象,并让方法选择合适的对象。注释@Transactional还需要指示要使用哪个事务管理器(假设您使用的DataSourceTransactionManager是而不是JpaTransactionManager),注意将事务管理器DataSourceSqlMapClient.