問題雜談:解決連接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、一個線程在同一時間內只能執行一個事務,而一個線程,在沒結束當前事務是無法釋放資源來執行第二個事務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章