溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

golang中mysql數(shù)據(jù)庫連接池的示例分析

發(fā)布時間:2021-05-11 13:52:57 來源:億速云 閱讀:558 作者:小新 欄目:編程語言

這篇文章主要介紹golang中mysql數(shù)據(jù)庫連接池的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

golang的優(yōu)點

golang是一種編譯語言,可以將代碼編譯為機(jī)器代碼,編譯后的二進(jìn)制文件可以直接部署到目標(biāo)機(jī)器而無需額外的依賴,所以golang的性能優(yōu)于其他的解釋性語言,且可以在golang中使用goroutine來實現(xiàn)并發(fā)性,它提供了一個非常優(yōu)雅的goroutine調(diào)度程序系統(tǒng),可以很容易地生成數(shù)百萬個goroutine。

最近在使用go語言的orm做一些數(shù)據(jù)庫的操作,最后發(fā)現(xiàn)了一個bug就是invalid connection,所以就去的了解了一下鏈接池和mysql的超時時間,下面我就用go的orm+mysql來說明(我理解語言都是相通的,原理應(yīng)該都是一樣的)。

在我們要對數(shù)據(jù)庫進(jìn)行增刪改查的時候,第一步就是要去連接數(shù)據(jù)庫

//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數(shù)據(jù)庫,設(shè)置的最大連接池為50,最大空閑連接是50。

而這個連接池主要是做什么的呢?簡單的說就是,你要去數(shù)據(jù)庫里面拿數(shù)據(jù)改數(shù)據(jù),你就需要和數(shù)據(jù)庫建立起一個管道,這個就是建立一個網(wǎng)絡(luò)連接,我們都知道tcp連接是比較耗時的,那么既然已經(jīng)花了一定時間去建立了這個管道,那么我怎么才能隨取隨用,而不用丟棄呢?那么連接池就是存放這些已經(jīng)建立的管道的地方,50這個數(shù)值呢,可以簡單的理解成最多放50個管道,注意,這個并不是越大越好,因為太大的話會比較占內(nèi)存,當(dāng)然了太小了會出現(xiàn)等待阻塞的情況。

既然連接池里面就是放這些管道的,那么空閑連接就是指這些空閑的管道,那么就很明顯了,空閑連接的數(shù)值設(shè)置就不要大于連接池的大小了,因為大了連接池也不會幫你保存那么多的空閑連接管道的。

了解了這些簡單的概念之后,那么每次訪問數(shù)據(jù)庫的時候是怎么一個工作流呢?

golang中mysql數(shù)據(jù)庫連接池的示例分析

通過這個圖我們就可以很清晰的看到整個連接訪問的流程。

step1(獲取可用的連接)去連接池里面尋找可用的空閑連接,如果沒有空閑的連接了,那么就去判斷是否連接池已滿,如果沒有超過,那么就去新建一個連接,如果滿了,那么就等待連接的釋放;當(dāng)然了,如果有空閑連接的話,就直接判斷這個連接是否過期,沒有過期就直接用,過期了就重新去判斷這個連接池是否已經(jīng)滿了,沒有的話就去新建連接,滿了就等待。

step2 (操作數(shù)據(jù)庫)拿到了這個連接就去做增刪改查操作。

step3 (釋放連接)操作完數(shù)據(jù)庫之后需要釋放連接,那么釋放的連接就會空閑下來,如果超過空閑連接數(shù),就是直接關(guān)閉掉,如果沒有就給等待的使用。

那么你就會注意到了,這個連接是會失效的:

mysql數(shù)據(jù)庫的timeout,當(dāng)你和數(shù)據(jù)庫建立起連接的時候,數(shù)據(jù)庫不能一直信任你啊,那么數(shù)據(jù)庫就有了超時這一說,就是過了這個時間段我就不信任你這個連接了,你必須再次和我連接,查看數(shù)據(jù)庫設(shè)置的各種超時時間的語句如下:

show variables like  '%timeout%';

其中這里面會有兩個超時時間:交互式連接超時時間(interactive_timeout)和非交互式連接超時時間(wait_timeout)

交互式連接:就是你通過命令行與mysql連接

非交互式連接:就是在程序中與mysql連接

而這個非交互超時時間就是在連接池里面一直空閑的連接的空閑時間超過wait_timeout的設(shè)定的時候就會失效。那么這個時候當(dāng)程序拿到這個空閑連接的時候去做查詢的時候就會出現(xiàn)最開始出現(xiàn)的問題,invalid connection。

了解了基本原理之后,針對invalid connection無效連接的解決辦法就很簡單了:

1.  延長數(shù)據(jù)庫的wait_timeout時間。

2. 程序定時去檢查這些失效的連接及時丟棄掉,注意這里程序的檢查時間就需要小于mysql設(shè)置的wait_timeout的值。

以上是“golang中mysql數(shù)據(jù)庫連接池的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI