首頁 > 後端開發 > Golang > 帶你理解golang mysql資料庫連線池

帶你理解golang mysql資料庫連線池

藏色散人
發布: 2021-05-11 11:33:08
轉載
3002 人瀏覽過

下面由golang教學欄位來跟大家介紹golang mysql資料庫連線池,希望對需要的朋友有幫助!

最近在用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資料庫連線池的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板