線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3465
推到 Plurk!
推到 Facebook!

關于使用IdTCPServer、ADOQUERY對SQL數據庫操作的疑問

答題得分者是:lu
zhgwbzhd
一般會員


發表:10
回覆:32
積分:18
註冊:2008-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-30 08:33:57 IP:221.218.xxx.xxx 未訂閱
小弟現在的程序如下:
1、該程序作為service。
2、使用adoquery對數據庫進行數據操作。
3、使用IdTCPServer進行客戶端連接。

我的疑問如下:

1、每個socket連接之后,都會根據不同的客戶端髮過來的信息,通過adoquery從數據庫中檢索數據。

2、那么在使用綫程1正在檢索時,其他的綫程會不會中斷adoquery的數據,而造成混亂呢????

謝謝啊!
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-30 09:27:29 IP:218.210.xxx.xxx 訂閱

===================引 用 zhgwbzhd 文 章===================
小弟現在的程序如下:
1、該程序作為service。
2、使用adoquery對數據庫進行數據操作。
3、使用IdTCPServer進行客戶端連接。

我的疑問如下:

1、每個socket連接之后,都會根據不同的客戶端髮過來的信息,通過adoquery從數據庫中檢索數據。

2、那么在使用綫程1正在檢索時,其他的綫程會不會中斷adoquery的數據,而造成混亂呢????
不會,不過你的 ADO 在操作時,該 unit 請先 include
並在 function 一進入時加入 CoInitialize(nil); 離開時加入這一行 CoUninitialize;


例 :

[code cpp]
void ADOQueryTest
{
CoInitialize(nil);

... ADO 相關程式

CoUninitialize;
}
[/code]


謝謝啊!
------
價值的展現,來自於你用哪一個角度來看待它!!
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-01 09:50:35 IP:203.73.xxx.xxx 訂閱
基本上是不會中斷或干擾其他THREAD對資料庫的操作,但是這是有前提低

1. 不可多個THREAD使用同一個ADOQuery
2. 不可多個THREAD使用同一個ADOConnection,即所有THREAD使用的 ADOQuery 都連接至同一個 ADOConnection
3 .請限制同時操作資料庫的數量,資料庫不是萬能的,他經不起你萬箭齊發式的要求(當然~~有的資料庫是經的起,只是...要$$)

===================引 用 zhgwbzhd 文 章===================
小弟現在的程序如下:
1、該程序作為service。
2、使用adoquery對數據庫進行數據操作。
3、使用IdTCPServer進行客戶端連接。

我的疑問如下:

1、每個socket連接之后,都會根據不同的客戶端髮過來的信息,通過adoquery從數據庫中檢索數據。

2、那么在使用綫程1正在檢索時,其他的綫程會不會中斷adoquery的數據,而造成混亂呢????

謝謝啊!
zhgwbzhd
一般會員


發表:10
回覆:32
積分:18
註冊:2008-07-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-01 11:52:27 IP:221.218.xxx.xxx 未訂閱
目前,小弟確實不知2樓老兄的方法該如何實現。

我覺得3樓老兄說的比較正確。

那我要實現多綫程操作數據庫,是不是隻有在每一個綫程創建時都創建一個adoconnect和adoquery了??

如果有很多adoconnect的話,是不是會嚴重影響速度呢???

還有沒有更好的方法呢??

小弟再次謝謝了。
編輯記錄
zhgwbzhd 重新編輯於 2008-08-01 12:13:43, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-01 12:52:07 IP:218.210.xxx.xxx 訂閱
其實 Lu 大說的解答是對的,但其實我說的那個 

CoInitialize(nil); // C 應該是用 NULL
Help : Initializes the COM library on the current thread and identifies the concurrency model as single-thread apartment (STA).

CoUninitialize;
本次的鎖定完成

所以其實當你呼叫 CoInit... 時,該 ADO Object 此時只為 Single Thread 工作,其他請排隊,當你把很多的功能拆開時,其實每個 ADO 的工作內容 Loading 相當的輕 (當然資料庫的最佳化要做好), 那麼每個在後面等待的 Thread 其實不會等太久的,而且這時的 Function 裡只有一個 Single ADO Object 在動作,對 ADOConnection 來說,也只有一個元件在對他動作,所以 ADOConnection 一點事也沒有,我的作法其實有點像這樣

下面用 Delphi 來表示一下,因為我對 c 不熟

[code delphi]
function TdmDatabase.Login: Boolean;
begin
CoInitialize(nil); // C 應該是用 NULL

sp_01_Login.Parameters1......
sp_01_Login.Parameters2......
sp_01_Login.ExecProc;
Result := sp_01_Login.Param... (ReturnValue);

CoUninitialize;
end;

function TdmDatabase.ReadUserData: String;
begin
CoInitialize(nil);

sp_02_ReadUserData.Parameters1......
sp_02_ReadUserData.Parameters2......
sp_02_ReadUserData.ExecProc;
Result := sp_02_ReadUserData.Param... (ReturnValue);

CoUninitialize;
end;
[/code]

這樣不知道 zhgwbzhd 大了解我的意思嗎?,記得要 include ActiveX.h 這行在上面那篇不見了,難怪大大不能動

========引 用 zhgwbzhd 文 章===================
目前,小弟確實不知2樓老兄的方法該如何實現。

我覺得3樓老兄說的比較正確。

那我要實現多綫程操作數據庫,是不是隻有在每一個綫程創建時都創建一個adoconnect和adoquery了??

如果有很多adoconnect的話,是不是會嚴重影響速度呢???

還有沒有更好的方法呢??

小弟再次謝謝了。
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-08-01 12:53:34, 註解 加入 include ActiveX.h ‧
careychen 重新編輯於 2008-08-01 13:06:44, 註解 無‧
careychen 重新編輯於 2008-08-01 13:11:10, 註解 無‧
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-01 13:16:34 IP:203.73.xxx.xxx 訂閱
在創建THREAD時就直接產生adoconnect和adoquer,基本上是對的

不過若有很多THREAD同時操作資料,請注意資料庫是否可承受這樣的操勞

另外....要注意的一點是,某些商業用資料庫,連線數量是有限制低.....

===================引 用 zhgwbzhd 文 章===================
目前,小弟確實不知2樓老兄的方法該如何實現。

我覺得3樓老兄說的比較正確。

那我要實現多綫程操作數據庫,是不是隻有在每一個綫程創建時都創建一個adoconnect和adoquery了??

還有沒有更好的方法呢??
zhgwbzhd
一般會員


發表:10
回覆:32
積分:18
註冊:2008-07-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-01 13:58:27 IP:222.130.xxx.xxx 未訂閱
非常感謝兩位老兄的大力幫助。

我現在的測試如下:

1、每個綫程均使用自己的adoconnect和adoquery,對數據庫的操作是沒有問題的。當然這個要受到數據庫的連接數量限製。

2、僅僅使用一個adoconncet,使用同一個adoquery,加上coinitialize,會齣現某個綫程的操作數據庫失敗的現象。
3、僅僅使用一個adoconncet,每個綫程使用各自的adoquery。也會齣現某個綫程的操作數據庫失敗的現象。

所以我覺得應該是adoconnect在處理多個adoquery時,在並髮的時候存在些問題。

不知各位老兄在處理類似的問題上,採用那種方法??
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-08-01 15:48:03 IP:203.73.xxx.xxx 訂閱
必須每一個THREAD擁有自己的 ADOConnection 及 ADOQuery

以下寫法均為錯誤
1. 多個THREAD操作同一個ADOQuery
2. 多個THREAD使用自己的ADOQuery,但這些ADOQuery 卻連接同一個ADOConnection

至於上述寫法為什麼不行,原因很簡單....Microsoft 的ADO物件不支援上述寫法


另外再說一下....每種資料庫,在某些特定寫法之下,會有問題,但是其他資料庫卻不會....個人推斷為資料庫之驅動程式的問題
所以在寫相關程式之前,請先撰寫一簡單程式,進行壓力測試,以明瞭資料庫極限在於何處


===================引 用 zhgwbzhd 文 章===================
非常感謝兩位老兄的大力幫助。

我現在的測試如下:

1、每個綫程均使用自己的adoconnect和adoquery,對數據庫的操作是沒有問題的。當然這個要受到數據庫的連接數量限製。

2、僅僅使用一個adoconncet,使用同一個adoquery,加上coinitialize,會齣現某個綫程的操作數據庫失敗的現象。
3、僅僅使用一個adoconncet,每個綫程使用各自的adoquery。也會齣現某個綫程的操作數據庫失敗的現象。

所以我覺得應該是adoconnect在處理多個adoquery時,在並髮的時候存在些問題。

不知各位老兄在處理類似的問題上,採用那種方法??
zhgwbzhd
一般會員


發表:10
回覆:32
積分:18
註冊:2008-07-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-08-01 15:55:27 IP:222.130.xxx.xxx 未訂閱
恩,樓上老兄說的極是。

我現在準備創建10個adoconnect,在創建每一個連接時,都去檢測一下哪個adoconnect后等待的數量較少,就把它放到哪個隊列。

現在測試中。

再次感謝兩位老兄的指點。
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-08-01 17:23:56 IP:218.210.xxx.xxx 訂閱
原來如此呀,感謝 Lu 大的指點,那這樣看起來是我的壓力測試不夠了.......

===================引 用 lu 文 章===================
必須每一個THREAD擁有自己的 ADOConnection 及 ADOQuery

以下寫法均為錯誤
1. 多個THREAD操作同一個ADOQuery
2. 多個THREAD使用自己的ADOQuery,但這些ADOQuery 卻連接同一個ADOConnection

至於上述寫法為什麼不行,原因很簡單....Microsoft 的ADO物件不支援上述寫法


另外再說一下....每種資料庫,在某些特定寫法之下,會有問題,但是其他資料庫卻不會....個人推斷為資料庫之驅動程式的問題
所以在寫相關程式之前,請先撰寫一簡單程式,進行壓力測試,以明瞭資料庫極限在於何處


===================引 用 zhgwbzhd 文 章===================
非常感謝兩位老兄的大力幫助。

我現在的測試如下:

1、每個綫程均使用自己的adoconnect和adoquery,對數據庫的操作是沒有問題的。當然這個要受到數據庫的連接數量限製。

2、僅僅使用一個adoconncet,使用同一個adoquery,加上coinitialize,會齣現某個綫程的操作數據庫失敗的現象。
3、僅僅使用一個adoconncet,每個綫程使用各自的adoquery。也會齣現某個綫程的操作數據庫失敗的現象。

所以我覺得應該是adoconnect在處理多個adoquery時,在並髮的時候存在些問題。

不知各位老兄在處理類似的問題上,採用那種方法??
------
價值的展現,來自於你用哪一個角度來看待它!!
zhgwbzhd
一般會員


發表:10
回覆:32
積分:18
註冊:2008-07-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-08-04 08:58:02 IP:221.218.xxx.xxx 未訂閱
不知哪位老兄有用隊列等待ado查詢的例子。

或者能否指點一二。

謝謝!
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-08-04 09:22:34 IP:203.73.xxx.xxx 訂閱
方式很多,要視你的應用而定,一般來說是用 Mutex , Event , Critical Sections , Semaphores 等,搭配 WaitForSingleObject 或 WaitForMultipleObjects 來做等待及取得使用權

這一部份可參閱站上相關其他文章

===================引 用 zhgwbzhd 文 章===================
不知哪位老兄有用隊列等待ado查詢的例子。

或者能否指點一二。

謝謝!
系統時間:2017-10-20 11:36:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!