簡體   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