golang mysql資料庫連線池的理解

2021-09-27 04:09:54 字數 1676 閱讀 8853

最近在使用go語言的orm做一些資料庫的操作,最後發現了乙個bug就是invalid connection,所以就去的了解了一下鏈結池和mysql的超時時間,下面我就用go的orm+mysql來說明(我理解語言都是相通的,原理應該都是一樣的)。

在我們要對資料庫進行增刪改查的時候,第一步就是要去連線資料庫

//conn the database

func conndb(dbconnstring string, dbname string) error

return err

}

這裡面連線的就是mysql資料庫,設定的最大連線池為50,最大空閒連線是50。

而這個連線池主要是做什麼的呢?簡單的說就是,你要去資料庫裡面拿資料改資料,你就需要和資料庫建立起乙個管道,這個就是建立乙個網路連線,我們都知道tcp連線是比較耗時的,那麼既然已經花了一定時間去建立了這個管道,那麼我怎麼才能隨取隨用,而不用丟棄呢?那麼連線池就是存放這些已經建立的管道的地方,50這個數值呢,可以簡單的理解成最多放50個管道,注意,這個並不是越大越好,因為太大的話會比較佔記憶體,當然了太小了會出現等待阻塞的情況。

既然連線池裡面就是放這些管道的,那麼空閒連線就是指這些空閒的管道,那麼就很明顯了,空閒連線的數值設定就不要大於連線池的大小了,因為大了連線池也不會幫你儲存那麼多的空閒連線管道的。

了解了這些簡單的概念之後,那麼每次訪問資料庫的時候是怎麼乙個工作流呢?

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

step1(獲取可用的連線)去連線池裡面尋找可用的空閒連線,如果沒有空閒的連線了,那麼就去判斷是否連線池已滿,如果沒有超過,那麼就去新建乙個連線,如果滿了,那麼就等待連線的釋放;當然了,如果有空閒連線的話,就直接判斷這個連線是否過期,沒有過期就直接用,過期了就重新去判斷這個連線池是否已經滿了,沒有的話就去新建連線,滿了就等待。

step2 (運算元據庫)拿到了這個連線就去做增刪改查操作。

step3 (釋放連線)操作完資料庫之後需要釋放連線,那麼釋放的連線就會空閒下來,如果超過空閒連線數,就是直接關閉掉,如果沒有就給等待的使用。

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

mysql資料庫的timeout,當你和資料庫建立起連線的時候,資料庫不能一直信任你啊,那麼資料庫就有了超時這一說,就是過了這個時間段我就不信任你這個連線了,你必須再次和我連線,檢視資料庫設定的各種超時時間的語句如下:

show variables like  '%timeout%';
互動式連線:就是你通過命令列與mysql連線

非互動式連線:就是在程式中與mysql連線

而這個非互動超時時間就是在連線池裡面一直空閒的連線的空閒時間超過wait_timeout的設定的時候就會失效。那麼這個時候當程式拿到這個空閒連線的時候去做查詢的時候就會出現最開始出現的問題,invalid connection。

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

1.  延長資料庫的wait_timeout時間。

2. 程式定時去檢查這些失效的連線及時丟棄掉,注意這裡程式的檢查時間就需要小於mysql設定的wait_timeout的值。

以上就是我對連線池的理解,如有錯誤還請大神指出,謝謝~

資料庫重連

4.2.10 資料庫自動重連 dbcp使用apache的物件池objectpool作為連線池的實現,在構造genericobjectpool時,會生成乙個內嵌類evictor,實現自runnable介面。如果 timebetweenevictionrunsmillis大於0,每過 timebetwe...

JDBC連Oracle資料庫

string drivername oracle.jdbc.driver.oracledriver string url jdbc oracle thin 172.28.139.78 1521 oracts string username scott string password tiger tr...

PL SQL Developer配置資料庫連線

1.伺服器a裝有oracle server 本機b需要連線a。2.在本機b中安裝oracle client 測試時安裝了企業版server 方式一 1.在本機b的程式中,找到orcale的net manager工具,並開啟。2.新建服務命令。a.net服務名,輸入自定義的名稱,如jf 129 位於1...