1. 程式人生 > >問題雜談:解決連線MySQL資料庫,執行緒休眠導致過滿的問題,“too Many Connection”

問題雜談:解決連線MySQL資料庫,執行緒休眠導致過滿的問題,“too Many Connection”

在開發Web應用時,可以自行處理資料連線,也可以交由所使用的Web框架管理。前段時間有人問我,為什麼自己已經將的資料連線事務交由Spring管理了,但在使用過程中還是總是出現“too Many Connection”的報錯。我在解決過程中發現了一些值得注意的地方,所以在這總結一下。

交代問題解決方法:他在使用Spring時並沒有什麼問題,只是不建議使用openSession,而是建議使用getcurrentSession,具體原因請轉至我的另一篇文章。我們先講問題出在哪?問題是在MySQL殺死休眠執行緒的時間。MySQL殺死休眠執行緒的時間預設是28800秒,所以將其時間更改為60秒(時間你自己看著改,不能太少,過少的話,在事務處理中就可能將執行緒殺死,一般大於等於你的請求時間),更改方式如下:

[mysqld]
character-set-server=utf8
basedir=C:\Program Files\MySQL\MySQL Server 5.7
datadir=C:\Program Files\MySQL\MySQL Server 5.7\data
port = 3306
#將下方兩行程式碼加入檔案#
wait_timeout=60
interactive_timeout=60

完成上述操作,即可解決執行緒休眠為殺死,導致連線池滿的問題。

那麼可能有人會問,不是說將事務交給Spring就可以幫我處理好資料連線的問題麼,為什麼還要自行設定MySQL的屬性呢?這就要理解MySQL中的連線、例項、會話、資料庫、執行緒之間的關係了,下面我簡要說明一下。

MySQL中的例項、資料庫關係簡述

1、MySQL是單程序多執行緒(Oracle等是多程序),也就是說MySQL例項在系統上表現就是一個服務程序,即程序(通過多種方式可以建立多例項,再安裝一個埠號不同的MySQL,或者通過workbench來新建一個埠號不同的伺服器例項等),該架構類似於SQL Server和Windows版本的Oracle。

2、MySQL例項是執行緒和記憶體組成,例項才是真正用於操作資料庫檔案的(MySQL資料庫是由一些列物理檔案組成,類似於frm,MYD,MYI,ibd結尾的檔案)。

3、一般情況下,一個例項操作一個或多個數據庫(Oracle一個例項對應一個數據庫),叢集情況下多例項操作一個或多個數據庫。

為什麼我們在安裝MySQL是需要生成一個.ini檔案呢?因為在例項啟動的時候MySQL會讀取配置檔案,類似於Oracle的spfile檔案,不同的是Oracle如果找不到引數檔案會啟動失敗,MySQL如果找不到配置檔案則會按照預設引數設定啟動例項。

MySQL中database、instance、session

MySQL中建立一個會話,不是和具體的資料庫相連,而是跟某個instance建立會話(每個會話可以使用不同的使用者身份)。而一個例項可以操作多個數據庫,故一個會話(在作業系統概念裡,會話即是執行緒)可以操作一個例項上的多個數據庫。

connection和session的定義和區別

1、連線(connection)是一個物理的概念,它指的是一個通過網路建立的客戶端和專用伺服器(Dedicated Server)或排程器的一個網路連線。

2、會話(session)是一個邏輯的概念,它存在於例項中。

注:建立一個連線(connection)實際上是在某個例項(instance,或者說是程序)中建立一個或多個執行緒。

3、一個連線可以擁有多個會話也可以沒有會話(實際上,一條連線上的各個會話可以使用不同的使用者身份),同一個連線上的不同會話之間不會相互影響。

4、兩個會話之間的影響,體現在鎖和鎖存,即對相同資源的操作(物件定義或資料塊)或請求(CPU/記憶體),它們的處理一般是按佇列來處理的,前面的沒有處理好,後面的就要等待。如果以打電話來比喻:connect就好比你接通對方,這時,connect就建立了,有沒有通話,不管。雙方進行通話,則session建立了,如果換人,則新的session建立,原session結束,類似的,可以在同一個connect上進行多個會話。最後,掛機,connect結束。

4、會話可以建立多個事務,比如:使用客端連線資料庫,這樣你就可以執行很多個事務了

5、一個事務只能由一個會話產生,在資料庫裡的事務,如果在執行的SQL都是由會話發起的,哪怕是自動執行的JOB也是由系統會話發起的

6、一個事務可能會產生一個或多個執行緒,比如RMAN備份,是可以建立多個執行緒可加快備份速度

7、一個執行緒在同一時間內只能執行一個事務,而一個執行緒,在沒結束當前事務是無法釋放資源來執行第二個事務