0
我正在運行使用squeryl和mysql數據庫的播放框架網站。 我需要使用squeryl將所有讀取查詢運行到從站,並將所有查詢寫入主站。如何實現用squeryl和播放框架的主/從結構
我該如何做到這一點?通過squeryl或通過jdbc連接器本身。
非常感謝,
我正在運行使用squeryl和mysql數據庫的播放框架網站。 我需要使用squeryl將所有讀取查詢運行到從站,並將所有查詢寫入主站。如何實現用squeryl和播放框架的主/從結構
我該如何做到這一點?通過squeryl或通過jdbc連接器本身。
非常感謝,
我不傾向於使用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狀態將被重置,但您會得到一般想法。
感謝戴夫的幫助。實際上,這種方法的唯一問題是在開發者一側完成讀/寫操作之間的分離,以將讀操作與寫操作分開。我想知道我們是否可以自動攔截查詢本身並決定它是否是讀/寫操作? 這個想法是爲了防止可能發生的任何人爲錯誤,因爲奴隸不應該收到任何寫操作。主設備只能處理寫操作並將其與從設備同步。 –
在這種情況下,我認爲你真的想在JDBC級別上做到這一點。我不知道你的建議是否是一個好方法。它會破壞事務語義,因爲事務必須發生在單個連接上。我希望將連接設置爲readOnly會導致驅動程序在開發人員嘗試發佈改變任何內容的語句時出錯,因此在測試期間讓這些錯誤發生並處理錯誤可能會更好。另外,請記住,「選擇更新」存在,所以你不能依賴一個選擇從不改變任何東西。 –