Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:只读事务的独立数据源_Java_Spring_Transactions_Ibatis - Fatal编程技术网

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

Java Spring:只读事务的独立数据源,java,spring,transactions,ibatis,Java,Spring,Transactions,Ibatis,谢谢你阅读这篇文章 我有两个MySQL数据库——主数据库用于写,从数据库用于读。我想象的完美场景是,我的应用程序使用连接到主服务器进行readOnly=false事务,从服务器进行readOnly=true事务 为了实现这一点,我需要根据当前事务的类型提供有效的连接。我的数据服务层不应该知道它使用什么类型的连接,而应该直接使用注入的SqlMapClient(我使用iBatis)。这意味着(如果我没有弄错的话)应该代理注入的SqlMapClients,并且应该在运行时选择委托 public cla

谢谢你阅读这篇文章

我有两个MySQL数据库——主数据库用于写,从数据库用于读。我想象的完美场景是,我的应用程序使用连接到主服务器进行
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会有所帮助,但仍然不容易。