對于ADO連接池進行顯示
學(xué)習(xí)ADO連接池是個很枯燥很煩惱的事,和顯示統(tǒng)計的報表,實際減輕了做報表的許多麻煩,初期未注意用戶數(shù)據(jù)量的問題,一直沒有什么問題,但是隨著用戶的數(shù)據(jù)量的急劇增大,已達百萬條,特別是在做內(nèi)聯(lián)接的查詢時。
為了盡量不更改數(shù)據(jù)結(jié)構(gòu)(如可以用增加表的方法,或是用存儲過程的方法,或是用job的方法先期統(tǒng)計等),所以一直在試驗?zāi)懿荒茉?FONT>ADO連接池解決,先后嘗試了許多方法,終于試驗成功,我的連接數(shù)據(jù)庫的公用文件是#t#
ADO連接池其實就是OLEDB連接池,是存在的。不過,MSDN的資料顯示,連接池應(yīng)該有至少一個常駐的連接存在才會起作用,ADO連接池所以應(yīng)該創(chuàng)建一個全局的連接并打開它。然后,在應(yīng)用程序中創(chuàng)建每次可用的臨時連接對象,再使用它。全局對象在程序退出釋放,但并不使用。你可以測試這樣做的效率和共享一個連接對象的效率。
死鎖的原因是因為事務(wù)中加鎖的順序。如果都是隱式的事務(wù)即單條SQL語句基本不會造成死鎖。顯式事務(wù)和游標操作即recordset的movenext等,ADO連接池會造成死鎖,要分析事務(wù)的加鎖過程,更新鎖、只讀鎖、獨占鎖等的次序問題。如果事務(wù)的開始就是獨占鎖或更新鎖大多數(shù)情況不會死鎖。
COM的智能指針_ConnectionPtr已經(jīng)封裝了異常機制不需要FAILED(HRESULT),源程序if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); ConnectionPtr.Close是關(guān)閉連接但不是釋放COM對象,釋放對象要_ConnectionPtr.Release(),ADO的程序注意MDAC的版本,***2.6以上。
pooling是ado自己實現(xiàn)的,對開發(fā)者是透明的,不過要想充分利用ado的pooling機制,需要注意幾點問題 ***:ADO連接池必須用完全同樣的連接字符串 第二:用完connection對象后,盡量快的調(diào)用close()關(guān)閉它,在vb,vbscript里也要顯式的調(diào)用close() 這樣ado會自動把連接放入池中,直到超時或應(yīng)用程序關(guān)閉。
com+里的pooling和ado的pooling基本上是不相干的,只有當(dāng)com+對象池中某對象被完全清除時,和此對象聯(lián)系的ADO連接池中的連接也會清空。 ado.net中連接池和ado中基本相同,只不過你可以明確的選擇不使用連接池機制。