Spring:为只读事务单独使用数据源

8

感谢阅读。

我有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个回答

4
这是一个有趣的想法,但你需要做出艰巨的努力。readOnly属性只是为事务管理器提供提示,并没有被任何有意义的地方使用。你需要重写或扩展多个Spring基础设施类。
因此,除非你非常想让它按照你的方式工作,否则最好的选择几乎肯定是将两个单独的SqlMapClient对象注入到你的DAO中,并让方法选择适当的对象。@Transactional注释也需要指示使用哪个事务管理器(假设你正在使用DataSourceTransactionManager而不是JpaTransactionManager),注意将事务管理器与SqlMapClient使用的DataSource匹配。

有没有更容易的方法,比如使用AspectJ? - artemb
@artemb:我确定AspectJ会有所帮助,但这仍然不会很容易。 - skaffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接