感谢阅读本文。
我有 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/