[英]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.