[英]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&allowSlavesDownConnections=true&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.