1. 程式人生 > >golang :連線資料庫閒置斷線的問題

golang :連線資料庫閒置斷線的問題

    golang在進行資料庫操作,一般來說我們使用Open函式建立一個數據庫(操作)控制代碼:
func Open(driverName, dataSourceName string) (*DB, error)
    我們知道,返回的*DB是一個具有零到多個底層連線的連線池,可以安全的被多個go程使用,並且會維護自身的閒置連線。所以一般來說open函式我們只調用一次,幾乎很少需要關閉DB。
    連線池可以使得連線更好的控制,於是簡單配置甚至是不做什麼配置就可以用了,事實好像也是如此,連上資料庫就都ok了。但是!你很可能會遇到下面這樣的錯誤:
[mysql] 2017/01/15 12:23:43 packets.go:124: write tcp 127.0.0.1:45697->127.0.0.1:3306:write: broken pipe
    其原因很有可能就是你的連線池沒有做好相關配置,或者配置了卻設定的值不對,那麼超時的原因大概有以下幾點:
    1.最大連線數大於資料庫伺服器端配置的最大連線數,多餘的連線在被使用到的時候出現連線超時
    2.網路抖動:每次連線的時候提交或維護大量資料,此時網路不穩定導致連線超時
    3.佔用的資源未被釋放,我們一般只open一次,獲取一個*DB,但是在使用stmt,rows或者是tx時候用完沒有關閉,耗盡資源也有可能導致連線超時。
    對於出現的3中問題,你可以試試下面的解決方案:
    1.對於最大連線數的問題,呼叫函式Db.SetMaxOpenConns()設定值(小於資料庫配置的最大連線)
    2.對於維護大量資料,可以嘗試採用事務操作,若失敗,回滾。然後重試。
    3.使用defer關鍵字,在啟用操作的時候直接在下一行加上defer *.close()函式return的時候會執行相關的關閉函式。
    如果你嘗試了以上的解決方案,還是發現偶爾會出現連線超時的錯誤的話,很可能是因為資料庫本身對連線有一個超時時間的設定,如果超時時間到了資料庫會單方面斷掉連線,此時再用連線池內的連線進行訪問就會出錯,
連線池中的每個連線都維護了一個建立時間,取連線的時候會自動檢查的,你可以試試呼叫db的SetConnMaxLifetime()方法來給db設定一個超時時間,時間小於資料庫的超時時間即可。 以上僅是個人的一下看法,若有錯誤之處,歡迎批評指出。