欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Delphi多線(xiàn)程下的ADO編程

Delphi多線(xiàn)程下的ADO編程

時(shí)間:2011-5-27來(lái)源:yang 作者: peng點(diǎn)擊: 134次

Delphi多線(xiàn)程下的ADO編程

 

 

前言:

幾個(gè)月前接到一個(gè)任務(wù):將一后臺程序訪(fǎng)問(wèn)數據庫的方式從BDE改為ADO,原因是由于業(yè)務(wù)量的增加,通過(guò)BDE不論是向數據庫寫(xiě)入數據還是從數據庫中讀出數據的速度都變得無(wú)法忍受,大家都知道ADO在數據庫訪(fǎng)問(wèn)速度方面比BDE要快的多了(我寫(xiě)了一個(gè)測試程序使用ADO比使用BDE快了近100倍!)。這個(gè)任務(wù)還不簡(jiǎn)單嘛,只要將BDE的控件更換成ADO的再修改一些代碼不就搞定了!我當時(shí)確實(shí)是這么想的,而且用了不到一個(gè)小時(shí)就搞定,測試運行一段沒(méi)問(wèn)題,大功告成了,我想。誰(shuí)知道一個(gè)惡夢(mèng)就此開(kāi)始,我的愚昧無(wú)知使我在程序中埋下了一個(gè)超級炸彈,它的威力不次于9.11撞擊世貿大廈的兩架客機,整個(gè)系統被它無(wú)情的催跨。程序在運行很長(cháng)一段時(shí)間候捕獲到一系列的異常:

OLE error 800A0E7F

Access violation at address 00135770. Write of address 005D8B78

Access violation at address 00178EC6. Read of address FFFFFFFF

Access violation at address 1F499BDD in module ‘msado15.dll‘. Read of address 0000000C

…….

接下來(lái)我們的系統就像世貿大廈一下悲壯的倒下了。

 

為什么?

       為什么?程序在為改動(dòng)之前使用BDE運行得好好的,我并沒(méi)有更改程序的結構???我十分的迷惑,當然要想解決問(wèn)題一切都得從錯誤代碼開(kāi)始。

   OLE error 800A0E7F:什么咚咚來(lái)的?它什么意思?什么原因引起的?我找了半天也沒(méi)有在我的系統里找到它的說(shuō)明,好在現在網(wǎng)絡(luò )發(fā)達,也許有人遇到跟我一樣的問(wèn)題吧,于是我用OLE error 800A0E7F作為關(guān)鍵字搜了一下,嘿嘿,果真被我找到了:

>0x800A0E7F Operation cannot be performed while executing
> asynchronously.

異步執行時(shí)操作不能被執行(完成),還是不太清楚錯誤的原因,于是我在一個(gè)網(wǎng)站發(fā)布了帖子求助,一些人告訴我ADO線(xiàn)程不安全,需要線(xiàn)程同步,事實(shí)上我的程序做了同步,而且針對不同的應用使用了多個(gè)ADOConnection,我想我應該自己動(dòng)手來(lái)好好研究一下這個(gè)問(wèn)題了,它很意思。接下來(lái)我該好好分析我的程序并做一系列的測試來(lái)找到那個(gè)炸彈。

 

找出炸彈

 

    在我的程序里所有訪(fǎng)問(wèn)數據庫都是通過(guò)一個(gè)DataModule單元TDataModule1類(lèi)提供的接口來(lái)完成,共有三個(gè)線(xiàn)程使用到了TDataModule1的對象DataModule1,DataModule1是一全局變量,下面是數據庫的訪(fǎng)問(wèn)模式的結構模型圖。(實(shí)際結構要復雜很多)

 

 


數據庫:
ADOConnection1
ADOConnection2
Table1
Table2
①ADOQuery1
②A(yíng)DOQuery3
①ADOProcedure1
①ADOProcedure2
①UpdateQuery
③ADOQuery2
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



圖1

說(shuō)明:


①UpdateQuery
 



                   ADOQuery控件用來(lái)修改table2記錄,①代表為線(xiàn)程1所有,

白色代表使用頻率很低(顏色越深說(shuō)明使用頻率越高)

 


③ADOQuery2
 



                   查詢(xún)table2,③代表為線(xiàn)程3所有,使用頻率較高

 


②A(yíng)DOQuery3
 



                   查詢(xún)table2,③代表為線(xiàn)程2所有,使用頻率很高

 


①ADOProcedure1
           

                      ADO存儲過(guò)程控件向表table2插入數據,屬于線(xiàn)程1頻繁使用

 


①ADOProcedure2
 



修改ADOProcedure1插入的記錄,屬于線(xiàn)程1頻繁使用

 

其中線(xiàn)程3和線(xiàn)程2使用ADO控件時(shí)沒(méi)有加鎖,而線(xiàn)程1的所有訪(fǎng)問(wèn)都加鎖了(這樣做毫無(wú)作用)

 

程序的結構出來(lái)了,問(wèn)題在哪里呢?接下來(lái)我寫(xiě)了一個(gè)小小的測試程序,該程序的結構與上面相同,它擁有三個(gè)線(xiàn)程和一個(gè)DataMoule單元,線(xiàn)程一通過(guò)ADOQuery1查詢(xún)數據庫DBTest的table1的記錄,線(xiàn)程二通過(guò)ADOQuery2向table1中插入記錄,線(xiàn)程三通過(guò)ADOQuery3修改table1中最后一條記錄的某個(gè)字段。ADOQuery1、ADOQuery2、ADOQuery3都通過(guò)ADOConnection1與數據庫DBTest1建立連接,一開(kāi)始,所有的線(xiàn)程都不做同步,運行,OK!錯誤出來(lái)了其中兩個(gè)錯誤正是我所想要的,這就是我的程序報的錯啊。

 


圖二

 

接下來(lái)我將三個(gè)ADOQuery都加上鎖,再運行沒(méi)問(wèn)題,我又將ADOQuery分別通過(guò)三個(gè)不同的ADOConnection來(lái)連接數據庫且不加鎖也沒(méi)有問(wèn)題??磥?lái)我是找到那個(gè)可惡的炸彈了,怎么拆了它?

 

排除炸彈

 

炸彈找到了,我該怎么拆它?是簡(jiǎn)單的做線(xiàn)程同步還是每個(gè)線(xiàn)程都是用一個(gè)ADOConnection?這下我再也不敢蠻干了,我得好好看看這方面的資料,在Delphi幫助文檔,《Using the main VCL thread》我找到了下面一段話(huà):

……

Data access components are thread-safe as long as each thread has its own database session component. The one exception to this is when you are using Access drivers. Access drivers are built using the Microsoft ADO library, which is not thread-safe.

…..

同樣在Delphi的幫助文檔《Managing multiple sessions》中給我明確的建議:

……

If you create a single application that uses multiple threads to perform database operations, you must create one additional session for each thread.

…..

喔找到了:ADO控件是線(xiàn)程不安全的,所以如果你的程序是使用多線(xiàn)程訪(fǎng)問(wèn)數據庫的話(huà)你應該確保每個(gè)線(xiàn)程都有自己的會(huì )話(huà)。

事實(shí)上在另外一本書(shū)《Delphi 4編程技術(shù)內幕》一書(shū)在談到線(xiàn)程安全數據庫訪(fǎng)問(wèn)也有相同的建議,不過(guò)臺灣李維先生在他的《Delphi 5.X ADO/MTS/COM+高級程序設計篇》卻說(shuō),如果你的程序不是連接多個(gè)數據庫的話(huà),最好同一數據庫使用一個(gè)連接,不要使用多個(gè)連接。怎么辦?誰(shuí)對誰(shuí)錯?為什么要使用一個(gè)連接呢?這主要是從服務(wù)器來(lái)考慮,因為數據庫服務(wù)器需要為每個(gè)連接分配一定的資源并對其進(jìn)行維護,連接數越多服務(wù)器方所耗的資源就越多,服務(wù)器的性能也就越差,所以要盡可能的減少客戶(hù)端的連接數。好在我的程序是作為服務(wù)器程序增加一些連接對數據庫服務(wù)器的影響不會(huì )很大,現在我可以重新設置我的數據庫訪(fǎng)問(wèn)結構模型了

 


數據庫:
ADOConnection1
ADOConnection2
Table1
Table2
①ADOQuery1
②A(yíng)DOQuery3
①ADOProcedure1
①ADOProcedure2
①UpdateQuery
③ADOQuery2
ADOConnection2
 

 

 

 

 

 



                                                                               

 

 

 

 

 

 

 

 

 

 

 

 

圖三

 

我增加了一個(gè)ADOConnection以保證每個(gè)線(xiàn)程都有一個(gè)自己連接(會(huì )話(huà)),從而避免出現資源沖突,我的問(wèn)題是不是解決了呢?是的,這個(gè)問(wèn)題已經(jīng)解決了,將我的程序與數據庫放在同一臺機器上運行沒(méi)有問(wèn)題,但是當程序與數據庫服務(wù)器不在同一臺機器上運行時(shí)會(huì )出現一個(gè)新的問(wèn)題。

 

[DBNMPNTW]ConnectionWrite(writeFile())錯誤

     這個(gè)錯誤不是多線(xiàn)程引起的,而是Micrsoft自己的一個(gè)問(wèn)題,產(chǎn)生該問(wèn)題的原因可能是因為網(wǎng)絡(luò )異常而引起的,可以通過(guò)SQLServer客戶(hù)端的默認的網(wǎng)絡(luò )協(xié)議named pipes network propocol 改為 TCP/IP Sockets,具體做法請參考Micrsoft技術(shù)支持網(wǎng)站的《Microsoft Knowledge Base Article - Q178040》

 

總結

   由于A(yíng)DO控件的線(xiàn)程不安全性(事實(shí)上這種不安全性是來(lái)自Micrsoft ADO Library,所以在其它開(kāi)發(fā)工具中也存在同樣的問(wèn)題)因此在使用多線(xiàn)程ADO編程時(shí)應該注意一下問(wèn)題:

 

第一:要保證每個(gè)線(xiàn)程都擁有自己的會(huì )話(huà)。

第二:作為客戶(hù)端程序應該盡可能的減少與數據庫庫服務(wù)器的連接數。

第三:在退出線(xiàn)程之前確保釋放所有的資源。

 

參考文獻:

1、李維《Delphi 5.X ADO/MTS/COM+高級程序設計篇》 機械工業(yè)出版社 2000。

2、Charlie Calvert《Delphi 4編程技術(shù)內幕》瀟湘工作室 譯 機械工業(yè)出版社 1999。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Delphi數據庫處理 jianshangcao 天極Blog
在Delphi中的下拉框ComboBox怎么連數據庫 Fieldbyname的用法
基于Delphi的Excel動(dòng)態(tài)報表技術(shù)
如何使用Delphi設計強大的服務(wù)器程序
第13章
DELPHI XE5 與SQLITE
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久