3

我與Hibernate框架(無彈簧)的Java應用程序連接到MySQL數據庫,管理連接通過C3P0關於DB游泳池和connection.setReadOnly()方法

我嘗試配置我apllication從從數據庫讀取緩存的行爲並寫入到主數據庫,我有如下此鏈接在一定程度上Master/Slave load balance

比方說,如果應用程序已經得到了與池連接的會話,它需要執行一個只讀的方法,這樣

public someReadOnlyMethod() 
{ 
    Session session = (get session from current Thread) 

      //set read-only so that it read from slave db 
      session.connection().setReadOnly(true); 

      (...connect to db to do something...) 

      //set it back in case of this method is followed by write method so that it go to master db 
      session.connection().setReadOnly(false); 


} 

池是否創建一個新的連接來連接到數據庫2次進行只讀和寫入操作(如果是這樣會嚴重影響性能),還是足夠聰明地將操作交換到已經存在的只讀和可寫連接池?

thx您的建議。

回答

0

所以這與游泳池無關;它都在mysql驅動程序中。 c3p0會將您的調用傳遞給底層連接的setReadOnly(無論是true還是false),並且Connection將相應地路由到主服務器或從服務器。

如果您不喜歡Connections默認方式(可能默認情況下它們不是隻讀),您可以在c3p0 ConnectionCustomizer的onAcquire方法中設置只讀屬性,並使用set(true或假)將成爲c3p0重置連接的默認設置。

祝你好運!

0

tl; dr:無論何時切換setReadOnly(true/false),它都會重新使用現有連接。

當您執行ReplicationDriver().connect(url)時,JDBC將連接到連接URL中列出的所有服務器。無論您切換setReadOnly()多少次,這些連接都將保持開放狀態以供重新使用。

來源:我剛剛測試過連接器/ J版本5.1.38與com.mysql.jdbc.ReplicationDriver