Java Spring:只读事务的独立数据源
谢谢你阅读这篇文章 我有两个MySQL数据库——主数据库用于写,从数据库用于读。我想象的完美场景是,我的应用程序使用连接到主服务器进行Java Spring:只读事务的独立数据源,java,spring,transactions,ibatis,Java,Spring,Transactions,Ibatis,谢谢你阅读这篇文章 我有两个MySQL数据库——主数据库用于写,从数据库用于读。我想象的完美场景是,我的应用程序使用连接到主服务器进行readOnly=false事务,从服务器进行readOnly=true事务 为了实现这一点,我需要根据当前事务的类型提供有效的连接。我的数据服务层不应该知道它使用什么类型的连接,而应该直接使用注入的SqlMapClient(我使用iBatis)。这意味着(如果我没有弄错的话)应该代理注入的SqlMapClients,并且应该在运行时选择委托 public cla
readOnly=false
事务,从服务器进行readOnly=true
事务
为了实现这一点,我需要根据当前事务的类型提供有效的连接。我的数据服务层不应该知道它使用什么类型的连接,而应该直接使用注入的SqlMapClient
(我使用iBatis)。这意味着(如果我没有弄错的话)应该代理注入的SqlMapClient
s,并且应该在运行时选择委托
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
对象注入到你的DAO中,并让方法选择合适的对象。@Transactional
注释还需要指明要使用哪个事务管理器(假设您使用的是DataSourceTransactionManager
而不是JpaTransactionManager
),注意将事务管理器与SqlMapClient
使用的DataSource
相匹配,例如,使用AspectJ有更简单的方法吗?@artemb:我相信AspectJ会有所帮助,但仍然不容易。