封裝ADO類進(jìn)行連接說明介紹
我本來說封裝的一個ADO類,有興趣的可以去看看,使用還是非常方便,ADO類開發(fā)了一個多線程的網(wǎng)絡(luò)服務(wù)程序a.exe,因?yàn)槁犝fADO不是線程安全的,所以認(rèn)為多線程不能共享連接。
現(xiàn)在的運(yùn)行方式是處理一個客戶請求開啟一個線程,每個線程都會打開一個數(shù)據(jù)庫連接,(線程運(yùn)行結(jié)束的時候,就會關(guān)閉連接)。開始運(yùn)行較為穩(wěn)定,運(yùn)行一兩天之后,打開連接就失敗了,ADO類重起服務(wù)程序之后,就可以連接成功。另外,該服務(wù)程序a.exe需要查詢、插入、更新數(shù)據(jù)庫中的表,同時另一個程序b.exe需要更新同樣的表,web服務(wù)器也要通過ASP查詢、插入這些表。問題如下:
1)導(dǎo)致連接失敗的原因是什么呢?ADO類打開的連接太多?(最多的時候a.exe有六個線程同時運(yùn)行,但是他們會頻繁的打開、關(guān)閉連接)。聽別人說“連接池”可以解決打開連接太多的帶來的問題,哪位高手解釋一下“連接池”如何實(shí)現(xiàn)?
2)b.exe在更新表中的記錄的時候,出現(xiàn)錯誤,大意如下:”0x80004005錯誤,spid 65作為事務(wù)死鎖的犧牲品,被禁止了,請重新運(yùn)行事務(wù)”,是不是進(jìn)程間訪問數(shù)據(jù)庫互斥操作導(dǎo)致的?如何解決呢?a.exe和b.exe采用不同的數(shù)據(jù)庫用戶登錄,也不行。事務(wù)死鎖會不會導(dǎo)致連接失敗呢? #t#
3)DB Connection 和 Session有何不同?二者的關(guān)系是什么呢?如何共享Connection呢?如何ADO類實(shí)現(xiàn)?
我已經(jīng)查閱了很多資料,一直沒能解決問題,請各位高手指點(diǎn)幾句。 因?yàn)槲沂切率殖鮼聿榈?,分?jǐn)?shù)有限,等有分了,再加分。 導(dǎo)致連接失敗的原因應(yīng)該是死鎖,這時很多進(jìn)程都在等待其他的進(jìn)程釋放連接,如果死鎖,肯定導(dǎo)致連接失敗 。
連接最好不要放到Session和Application中去,這樣在訪問人數(shù)多的時候容易死鎖,ADO類不是線程共享的,如果ADO類放到Session和Application中,連接一直不能被釋放,而總的連接數(shù)是固定的,其他的程序就一直等待連接的釋放,從而導(dǎo)致請求的隊(duì)列越來越長。
建立一個進(jìn)程共享區(qū),ADO類當(dāng)用戶請求連接并在查詢完成要釋放連接時,不關(guān)閉此連接,而是把這個連接放到共享區(qū)中。下一個用戶請求查詢時,先從共享區(qū)找有無可用連接,如果有,使用該連接查詢,如無,則新建一個,使用完畢后同樣放入共享區(qū)。
這樣帶來的問題:
1、共享區(qū)里的連接要做保護(hù),以免不同進(jìn)程同時使用一個連接;
2、要限制共享區(qū)連接的數(shù)目,以免資源耗盡;
3、要寫一個查詢可用連接的算法。