通過一段時間艱苦的奮鬥,終於把sql server的讀寫分離搞定了。你們能夠下載oneproxy-for-sqlserver來使用此功能。更多消息,能夠訪問平民軟件官網獲取。或者加入羣 數據庫監控 521095285,或者關注oneproxy-monitor框架項目(oneproxy-for-sqlserver是在此項目下開發的,會同步更新此框架)git
下面說說oneproxy-for-sqlserver讀寫分離的使用方法和開發中遇到的有趣問題。sql
爲了支持讀寫分離,須要修改[oneproxy]標籤的數據和增長[database_xxx]標籤的數據以及數據庫組的信息。詳細以下所示:數據庫
1) 在[oneproxy]標籤下面增長:passwordseparate = true和readslave=true。增長後的配置以下所示:session
[oneproxy] logfile = oneproxy_log.log pidfile = oneproxy_pid.pid listen_addr = 0.0.0.0 listen_port = 9999,7777,6666 httpserver_addr = 0.0.0.0 httpserver_port = 8080 log_level = error data_dump = false log_sql = false clientusername = admin clientpassword = 0000 passwordseparate = true readSlave = true
須要注意的是:框架
1)若是不配置,默認狀況下這兩個選項也是爲true。sqlserver
2)若是readSlave爲true,則必須配置passwordseparate爲true。spa
若是不想使用密碼分離功能,則一樣也不能使用讀寫分離功能。.net
2) 在數據庫配置組標籤[sqlserver_9999]下面增長主數據庫和從數據庫的信息,好比:code
[database_1433] host = 127.0.0.1 port = 1433 username = sa password = 0000 [database_1434] host = 127.0.0.1 port = 1434 username = sa password = 0000 [sqlserver_9999] dbmastergroup = database_1433 dbslavegroup = database_1434 classname = SSProtocol frontport = 0
須要注意點:server
1)數據庫的信息必須放置在[database_xxx]標籤下面。這個標籤必須以database開頭。
2)數據庫組信息放到其餘名稱的標籤(不能是[oneproxy]和[database_xxx]的標籤)下,如上配置中的[sqlserver_9999]標籤。
3)主數據庫配置在dbmastergroup上,從數據庫配置在dbslavegroup上。
4)容許不存在從數據庫,若是沒有從數據庫,則讀寫分離的功能被禁止。
完成上面的配置後,直接啓動程序便可。
1)事務中的操做所有在主數據庫執行
2)非事務中的select語句在從數據庫執行(無論是statement下的仍是preparedstatement下的)
在開發讀寫分離的過程當中,遇到不少問題。好比:
1) 當在同一個session中,從不一樣數據庫獲得的spid可能不一樣,則須要根據發送到不一樣的數據庫重寫spid。
2) 怎麼透明的處理遊標和prepared句柄。
3) 在事務中怎麼處理非事務中建立的statement或者preparedstatement.
4) 怎麼處理在事務中建立的statement和preparedstatement在非事務中使用的問題。
5)怎麼處理包中的事務描述符等數據。
在開發的過程當中,遇到因爲沒有重寫事務描述符,致使一直提示不能新開始一個事務的異常。針對這個問題,我研究了很長時間,同時直連和讀寫分離的包數據的比較查找數據包的差別點,以及讀MSDN文檔等衆多艱苦的過程。終於明白了處理方法。
2)平民軟件官網.