您好,登錄后才能下訂單哦!
這篇文章主要介紹golang中mysql數據庫連接池的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
golang是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。
最近在使用go語言的orm做一些數據庫的操作,最后發現了一個bug就是invalid connection,所以就去的了解了一下鏈接池和mysql的超時時間,下面我就用go的orm+mysql來說明(我理解語言都是相通的,原理應該都是一樣的)。
在我們要對數據庫進行增刪改查的時候,第一步就是要去連接數據庫
//conn the database func ConnDb(dbConnString string, dbName string) error { maxIdle := 50 maxConn := 50 err := orm.RegisterDataBase(dbName, "mysql", dbConnString+"?charset=utf8&loc=Asia%2FShanghai", maxIdle, maxConn) if err != nil { util.GLogger.Errorw("in Connect DB", "err", err) } return err }
這里面連接的就是mysql數據庫,設置的最大連接池為50,最大空閑連接是50。
而這個連接池主要是做什么的呢?簡單的說就是,你要去數據庫里面拿數據改數據,你就需要和數據庫建立起一個管道,這個就是建立一個網絡連接,我們都知道tcp連接是比較耗時的,那么既然已經花了一定時間去建立了這個管道,那么我怎么才能隨取隨用,而不用丟棄呢?那么連接池就是存放這些已經建立的管道的地方,50這個數值呢,可以簡單的理解成最多放50個管道,注意,這個并不是越大越好,因為太大的話會比較占內存,當然了太小了會出現等待阻塞的情況。
既然連接池里面就是放這些管道的,那么空閑連接就是指這些空閑的管道,那么就很明顯了,空閑連接的數值設置就不要大于連接池的大小了,因為大了連接池也不會幫你保存那么多的空閑連接管道的。
了解了這些簡單的概念之后,那么每次訪問數據庫的時候是怎么一個工作流呢?
通過這個圖我們就可以很清晰的看到整個連接訪問的流程。
step1(獲取可用的連接)去連接池里面尋找可用的空閑連接,如果沒有空閑的連接了,那么就去判斷是否連接池已滿,如果沒有超過,那么就去新建一個連接,如果滿了,那么就等待連接的釋放;當然了,如果有空閑連接的話,就直接判斷這個連接是否過期,沒有過期就直接用,過期了就重新去判斷這個連接池是否已經滿了,沒有的話就去新建連接,滿了就等待。
step2 (操作數據庫)拿到了這個連接就去做增刪改查操作。
step3 (釋放連接)操作完數據庫之后需要釋放連接,那么釋放的連接就會空閑下來,如果超過空閑連接數,就是直接關閉掉,如果沒有就給等待的使用。
那么你就會注意到了,這個連接是會失效的:
mysql數據庫的timeout,當你和數據庫建立起連接的時候,數據庫不能一直信任你啊,那么數據庫就有了超時這一說,就是過了這個時間段我就不信任你這個連接了,你必須再次和我連接,查看數據庫設置的各種超時時間的語句如下:
show variables like '%timeout%';
其中這里面會有兩個超時時間:交互式連接超時時間(interactive_timeout)和非交互式連接超時時間(wait_timeout)
交互式連接:就是你通過命令行與mysql連接
非交互式連接:就是在程序中與mysql連接
而這個非交互超時時間就是在連接池里面一直空閑的連接的空閑時間超過wait_timeout的設定的時候就會失效。那么這個時候當程序拿到這個空閑連接的時候去做查詢的時候就會出現最開始出現的問題,invalid connection。
了解了基本原理之后,針對invalid connection無效連接的解決辦法就很簡單了:
1. 延長數據庫的wait_timeout時間。
2. 程序定時去檢查這些失效的連接及時丟棄掉,注意這里程序的檢查時間就需要小于mysql設置的wait_timeout的值。
以上是“golang中mysql數據庫連接池的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。