您好,登錄后才能下訂單哦!
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設置一個超時時間,時間小于數據庫的超時時間即可。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。