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

时间:2010-07-19 12:25:30

标签: java spring transactions ibatis

感谢您阅读本文。

我有2个MySQL数据库 - 写入主数据,读取主数据库。我想象的完美场景是我的应用程序使用连接来掌握readOnly=false交易,奴隶用于readOnly=true交易。

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

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
    }
}

所以问题是 - 我怎么能这样做?

非常感谢

1 个答案:

答案 0 :(得分:4)

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

因此,除非你一心想要让这个工作成为你想要的,否则你最好的选择几乎肯定是在DAO中注入两个单独的SqlMapClient对象,以及选择合适的方法。 @Transactional注释还需要指明要使用的事务管理器(假设您使用DataSourceTransactionManager而不是JpaTransactionManager),注意将事务管理器与{{1}匹配由DataSource使用。