2014-11-17 64 views

回答

0

我不傾向於使用MySQL自己,但這裏有一個想法:

基於文檔here上,MySQL JDBC驅動程序將循環賽的奴隸當中,如果只讀屬性在Connnection上正確設置。爲了找回並更改當前的連接,你需要使用類似的代碼

transaction { 
    val conn = Session.currentSession.connection 
    conn.setReadOnly(true) 
    //Your code here 
} 

更妙的是,你可以創建自己的readOnlyTransaction方法:

def readOnlyTransaction(f: => Unit) = { 
    transaction { 
    val conn = Session.currentSession.connection 
    val orig = conn.getReadOnly() 
    conn.setReadOnly(true) 
    f 
    conn.setReadOnly(orig) 
    } 
} 

然後使用它像:

readOnlyTransaction { 
    //Your code here 
} 

您可能會想要清理一下,所以如果發生異常,默認的readOnly狀態將被重置,但您會得到一般想法。

+0

感謝戴夫的幫助。實際上,這種方法的唯一問題是在開發者一側完成讀/寫操作之間的分離,以將讀操作與寫操作分開。我想知道我們是否可以自動攔截查詢本身並決定它是否是讀/寫操作? 這個想法是爲了防止可能發生的任何人爲錯誤,因爲奴隸不應該收到任何寫操作。主設備只能處理寫操作並將其與從設備同步。 –

+0

在這種情況下,我認爲你真的想在JDBC級別上做到這一點。我不知道你的建議是否是一個好方法。它會破壞事務語義,因爲事務必須發生在單個連接上。我希望將連接設置爲readOnly會導致驅動程序在開發人員嘗試發佈改變任何內容的語句時出錯,因此在測試期間讓這些錯誤發生並處理錯誤可能會更好。另外,請記住,「選擇更新」存在,所以你不能依賴一個選擇從不改變任何東西。 –