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設置一個超時時間,時間小於數據庫的超時時間即可。

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM