概述ASP.NET連接數(shù)據(jù)庫
1.問題的發(fā)現(xiàn)
2006年下半年,筆者在山東臨淄齊魯石化駐地參與一個項目的開發(fā)。公司的另外一個項目《合同管理系統(tǒng)》正處于實施后期階段。該項目采用.Net開發(fā)的B/S架構(gòu)的系統(tǒng),使用Oracle做后臺數(shù)據(jù)庫。先后兩次發(fā)現(xiàn),當(dāng)在線用戶較多的時候,客戶端感覺服務(wù)系統(tǒng)反應(yīng)很慢(多數(shù)用戶報告在登錄界面點擊登錄按鈕后,一直處于等待狀態(tài),系統(tǒng)不再反應(yīng))。查看服務(wù)器使用情況,CPU和硬盤訪問并不繁忙,內(nèi)存占用也不是非常大;連接到數(shù)據(jù)庫沒有發(fā)現(xiàn)死鎖,但是會話非常多,大約在110個左右。開始懷疑是數(shù)據(jù)庫的進(jìn)程(Processes)和會話(Sessions)設(shè)置的值較低(未安裝時候的默認(rèn)值,分別為170和150)。但是將這兩個值擴(kuò)大以后仍舊未解決問題。在第二次發(fā)現(xiàn)該問題的時候,我注意到雖然設(shè)置值較低,但是當(dāng)前并未達(dá)到這兩個值得上限;同時我也注意到該系統(tǒng)連接數(shù)據(jù)庫的會話正好是100個,由此我聯(lián)想到數(shù)據(jù)庫連接池。
2.相關(guān)資料
使用連接字符串關(guān)鍵字控制連接池SqlConnection 對象的 ConnectionString 屬性支持連接字符串鍵/值對,這些鍵/值對可用于調(diào)整連接池邏輯的行為。
ASP.NET連接數(shù)據(jù)庫,數(shù)據(jù)庫連接池默認(rèn)是開啟的,并且池中允許的最大連接數(shù)默認(rèn)為100。由此基本可以確定,訪問系統(tǒng)收到的阻礙時由于連接池已滿造成的。
該頁面中提到,如果連接池中的連接全部占用,系統(tǒng)會在連接池之外開啟新的連接。這個說法有疑問,該問題在后面的會體積。
3.問題的確認(rèn)
為了驗證ASP.NET連接數(shù)據(jù)庫時,連接池中的連接達(dá)到最大數(shù),新的連接就需要等待連接池中的連接釋放資源,我編寫了一個測試頁面,在頁面裝載的時候,首先打開10個連接,然后等待20秒鐘后再關(guān)閉這些連接。隨后使用測試機(jī)打開兩個測試線程訪問該測試頁面,然后在瀏覽器中打開于這個測試頁面使用相同連接字串的另外一個頁面,發(fā)現(xiàn)后者的確需要等待測試線程訪問的頁面處理完畢之后才可以連接到數(shù)據(jù)庫。
4.問題的解決
找到問題的癥結(jié)所在,我們系統(tǒng)的ASP.NET連接數(shù)據(jù)庫的字串,增加了Max Pool Size項,根據(jù)需要將其設(shè)置為200。同時修改了Oracle服務(wù)器的的會話(Sessions)和進(jìn)程(Progresses)的值以滿足連接會話的需要。
5.疑問
如前所述,資料中提及,如果連接池的連接全部占用,會創(chuàng)建新的連接。但是在采用默認(rèn)連接池大小和設(shè)置為20個最大連接數(shù)的時候,連接池的所有連接全部占用,新的連接請求并沒有開啟新的連接會話,而是等待連接池中的連接釋放。
但是連接池最大連接數(shù)設(shè)置為200個的時候,該系統(tǒng)的連接曾經(jīng)一度超過200個上限,達(dá)210多個。由此可以判斷超出的連接請求在連接池之外創(chuàng)建了新的連接會話,符合了資料中的論述。對此疑問,煩請知情者闡述一下自己的觀點。
6.補充
在連接字串修改之后,原有的連接池會重新構(gòu)建,這一特性是否可以在何種情況下應(yīng)用?
【編輯推薦】