繁体   English   中英

使用com.mysql.jdbc.ReplicationDriver的MySql Master / Slave Spring Hibernate

[英]MySql Master/Slave Spring Hibernate with com.mysql.jdbc.ReplicationDriver

我有一个Web应用程序,它在Tomcat上运行使用spring(4.2.9.RELEASE),hibernate(5.1.3.Final)和mysql复制驱动程序。 所有查询都将转到主数据库,而所有查询都不会转到副本数据库。 这是我的背景资源:

<Resource auth="Container" 
        driverClassName="com.mysql.jdbc.ReplicationDriver" 
        defaultAutoCommit="false"
        initialSize="3" 
        logAbandoned="false"
        maxActive="200" 
        maxIdle="5" 
        maxWait="10000" 
        name="jdbc/powerptc" 
        removeAbandoned="true" 
        testOnBorrow="true" 
        type="javax.sql.DataSource" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        username="xxxxxxx" 
        password="xxxxxx"   
        url="jdbc:mysql:replication://localhost:3306,slave.test.net:3306/powerptc?autoReconnect=true&amp;allowSlavesDownConnections=true&amp;readFromMasterWhenNoSlaves=true" 
        validationQuery="SELECT 1"/>  

在我的服务层中,我有这样的只读方法设置...

@Override
@Transactional(readOnly = true)
public List<Location> getAll(long customerId) {
    return dao.getAll(customerId);
}

当调用此方法(作为入口点)时,我所有的查询都转到主数据库而不是从数据库。

我一直在寻找答案,我认为问题在于休眠状态未将基础连接设置为只读,因此复制驱动程序会将所有查询发送给主服务器。 所以我的问题是,spring / hibernate应该将连接设置为readOnly还是我需要用AOP或类似的工具来做到这一点? 似乎有些帖子说应该将连接设置为只读,而其他帖子则说不可以。 有人可以帮我澄清一下,希望我可以解决我的问题。 提前致谢!

因此,事实证明,当您使用直接JPA时,一切都可以完美运行。 该应用程序仍在使用Hibernate的SessionFactory,因此当我将所有内容切换到EntityManager时,所有内容都可以运行,而无需AOP来拦截连接获取。 我只是用@Transactional(readOnly = true)标记了我的服务层,并且一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM