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