全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3400
推到 Plurk!
推到 Facebook!

多個執行緒,多個ADOQuery , 是否可行?

答題得分者是:lu
salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-16 08:50:51 IP:202.39.xxx.xxx 未訂閱
各位大大您們好:

小弟有一事想請問各位大大,不知這樣做是否可行??

程式動態產生多個執行緒,並傳送一個 ADOConnection 指標給它,(表示執行緒共用同一個 ADOConnection 連 Access 資料庫[mdb] )

每個執行緒有一個ADOQuery Connection 到 ADOConnection,

每個執行緖有新增資料到某一個 table 的動作(每個執行緒都是新增到這個 table)。

我是想請問一下,這樣子情況下,當執行緒 一多時,會不會有問題??

或者問說 ADOConnection 元件可以給多少個 ADOQuery Connection ??

若有相關經驗的大大,是否可以提供一些意見,謝謝!!

lu
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-16 11:54:52 IP:203.73.xxx.xxx 訂閱
根據我個人的經驗(Multi Thread + ADO + SQL Server/Access),如果你所有的THREAD共用同一個ADOConnection ,這樣做可能會有資料鎖定的問題,在這個CASE則是可能慧心增資料失敗,建議每一個THREAD產生一個ADOConnection ,然後再用這個ADOConnection 去操作資料庫

另外提一件事......我不太確定ACCESS的JET引擎有支援 Multi Thread 嗎? ADO 本身支援 Multi Thread 這點無庸置疑,但是不代表每一種資料庫驅動程式都支援Multi Thread...
根據偶個人的實驗 Access 的資料庫不太能負荷這樣的操作,建議改用 SQL Server


===================引 用 salo0610 文 章===================
各位大大您們好:

小弟有一事想請問各位大大,不知這樣做是否可行??

程式動態產生多個執行緒,並傳送一個 ADOConnection 指標給它,(表示執行緒共用同一個 ADOConnection 連 Access 資料庫[mdb]? )

每個執行緒有一個ADOQuery Connection 到 ADOConnection,

每個執行緖有新增資料到某一個 table 的動作(每個執行緒都是新增到這個 table)。

我是想請問一下,這樣子情況下,當執行緒 一多時,會不會有問題???

或者問說 ADOConnection 元件可以給多少個 ADOQuery? Connection ??

若有相關經驗的大大,是否可以提供一些意見,謝謝!!

salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-16 13:28:36 IP:220.132.xxx.xxx 未訂閱
lu 大大您好:
每一個THREAD產生一個ADOConnection ,
我試著同一個檔案( Access 資料庫[mdb] ) 用多個 ADOConnection 同時 Connection ,好像最多可以只有六十四個 ADOConnection 耶!!


===================引 用 lu 文 章===================
根據我個人的經驗(Multi Thread ADO SQL Server/Access),如果你所有的THREAD共用同一個ADOConnection ,這樣做可能會有資料鎖定的問題,在這個CASE則是可能慧心增資料失敗,建議每一個THREAD產生一個ADOConnection ,然後再用這個ADOConnection 去操作資料庫

另外提一件事......我不太確定ACCESS的JET引擎有支援 Multi Thread 嗎? ADO 本身支援 Multi Thread 這點無庸置疑,但是不代表每一種資料庫驅動程式都支援Multi Thread...
根據偶個人的實驗 Access 的資料庫不太能負荷這樣的操作,建議改用 SQL Server


lu
高階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-16 13:59:00 IP:203.73.xxx.xxx 訂閱
64個~~你不是跟偶開玩笑吧?
一般來說,寫類似的程式大都必須限制同時 Connected 的數量,原因很簡單~~2個字~~資源

1. 像ACCESS這種檔案型的資料庫,基本上,是設計給一個人或少數人共同使用,如果你把他拿來在多人環境下使用,通常會出問題,至於會出啥問題~~不在此討論的範圍,你可以上網搜尋一下,粉多人遭遇類似的問題,像本CASE你開了64個Connection ,基本上就像64個USER一起開啟資料庫

2.不管是那一種資料庫,同時可連線的CLIENT,不可能是無限低~~因為類似SQL SERVER等大型資料庫,連線數是要COCO低......而且是粉貴

3.同時連線的數量多了,資料庫的效能反而會變慢喔~~最有可能的情況是拖慢整體的效能喔

4.最重要的一點~~你的PC的資源(CPU、RAM等等)也是有限低,不可能同時產生那麼多的 ActiveX 物件啦


類似的程式允許同時有10個CONNECTION連上資料庫,應該就夠用了

===================引 用 salo0610 文 章===================
lu 大大您好:
每一個THREAD產生一個ADOConnection?,
我試著同一個檔案( Access 資料庫[mdb]? ) 用多個 ADOConnection 同時 Connection ,好像最多可以只有六十四個 ADOConnection?耶!!

salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-16 14:16:40 IP:220.132.xxx.xxx 未訂閱
呵!!  lu 大大!! 
主要是根據你說的 ---> "建議每一個THREAD產生一個ADOConnection ,然後再用這個 ADOConnection 去操作資料庫"
我去試一下可以同時 Connection 數啦!!
就算是這樣做沒問題,但也只限 六十四個,所以也沒有用。

不過呢!! 當然也是要感謝你一些經驗的分享!! 啊利啊多!!

==================引 用 lu 文 章===================
64個~~你不是跟偶開玩笑吧?
一般來說,寫類似的程式大都必須限制同時 Connected 的數量,原因很簡單~~2個字~~資源

1.?像ACCESS這種檔案型的資料庫,基本上,是設計給一個人或少數人共同使用,如果你把他拿來在多人環境下使用,通常會出問題,至於會出啥問題~~不在此討論的範圍,你可以上網搜尋一下,粉多人遭遇類似的問題,像本CASE你開了64個Connection ,基本上就像64個USER一起開啟資料庫

2.不管是那一種資料庫,同時可連線的CLIENT,不可能是無限低~~因為類似SQL SERVER等大型資料庫,連線數是要COCO低......而且是粉貴

3.同時連線的數量多了,資料庫的效能反而會變慢喔~~最有可能的情況是拖慢整體的效能喔

4.最重要的一點~~你的PC的資源(CPU、RAM等等)也是有限低,不可能同時產生那麼多的 ActiveX 物件啦


類似的程式允許同時有10個CONNECTION連上資料庫,應該就夠用了

===================引 用 salo0610 文 章===================
lu 大大您好:
每一個THREAD產生一個ADOConnection?,
我試著同一個檔案( Access 資料庫[mdb]? ) 用多個 ADOConnection 同時 Connection ,好像最多可以只有六十四個 ADOConnection?耶!!

salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-16 14:30:15 IP:220.132.xxx.xxx 未訂閱
呵!!  lu 大大!! 
主要是根據你說的 ---> "建議每一個THREAD產生一個ADOConnection ,然後再用這個 ADOConnection 去操作資料庫"
我去試一下可以同時 Connection 數啦!!
就算是這樣做沒問題,但也只限 六十四個,所以也沒有用。

不過呢!! 當然也是要感謝你一些經驗的分享!! 啊利啊多!!

==================引 用 lu 文 章===================
64個~~你不是跟偶開玩笑吧?
一般來說,寫類似的程式大都必須限制同時 Connected 的數量,原因很簡單~~2個字~~資源

1.?像ACCESS這種檔案型的資料庫,基本上,是設計給一個人或少數人共同使用,如果你把他拿來在多人環境下使用,通常會出問題,至於會出啥問題~~不在此討論的範圍,你可以上網搜尋一下,粉多人遭遇類似的問題,像本CASE你開了64個Connection ,基本上就像64個USER一起開啟資料庫

2.不管是那一種資料庫,同時可連線的CLIENT,不可能是無限低~~因為類似SQL SERVER等大型資料庫,連線數是要COCO低......而且是粉貴

3.同時連線的數量多了,資料庫的效能反而會變慢喔~~最有可能的情況是拖慢整體的效能喔

4.最重要的一點~~你的PC的資源(CPU、RAM等等)也是有限低,不可能同時產生那麼多的 ActiveX 物件啦


類似的程式允許同時有10個CONNECTION連上資料庫,應該就夠用了

===================引 用 salo0610 文 章===================
lu 大大您好:
每一個THREAD產生一個ADOConnection?,
我試著同一個檔案( Access 資料庫[mdb]? ) 用多個 ADOConnection 同時 Connection ,好像最多可以只有六十四個 ADOConnection?耶!!

lu
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-16 14:38:52 IP:203.73.xxx.xxx 訂閱
不客氣~~只是好奇的問一下,你需要能同時連上幾個Connection才夠阿?

一般來說類似的程式,是資料處理完成後就 Disconnect 了,THREAD結束後就把 該物件給DELETE掉了

64個CONNECTION,怎麼會不夠用勒

偶寫的APPLICATION SERVER用10個Connection 就可以處理將近100個遠端DEVICE的資料傳送及連線了...

===================引 用 salo0610 文 章===================
呵!!? lu 大大!!?
主要是根據你說的 ---> "建議每一個THREAD產生一個ADOConnection ,然後再用這個 ADOConnection 去操作資料庫"
我去試一下可以同時 Connection 數啦!!
就算是這樣做沒問題,但也只限 六十四個,所以也沒有用。

不過呢!! 當然也是要感謝你一些經驗的分享!! 啊利啊多!!

salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-17 09:02:45 IP:220.132.xxx.xxx 未訂閱
有數個 DEVICE(硬体),與PC連線的方式多種( comport 、 socket....) ,
這些 DEVICE 遇到狀況時,可能會傳一筆資料回來 PC,當PC 收到這些資料時要將這些資料做儲存,
因此想用 THREAD 分別去處理這些 DEVICE 的 Connect 及資料寫入資料庫,
雖然在沒有資料 可以 Close ADOConnection Connection ,
但如果 DEVICE 同時有資料時,又要 開開關關 ADOConnection Connection (<--我想這會出問題的吧)
所以我想是每個 THREAD 用 ADOQuery 連到同一個 ADOConnection 做處理,
但也不知 這樣做是不是會有問題~
當然希望可以連線的DEVICE 越多越好啊!!

ps:
在非真正多工的環境下,THREAD 是應該是一種排程,而非同時在運作處理,
也因此我想如果每個 THREAD 在 ADOQuery Open --> 新增資料 --> ADOQuery Close ,
當它是必需完成後,其它的 THREAD 才可以做新增資料(這樣的一個流程)的動作的話。
應該沒有 資料鎖定 或 新增資料失敗的問題。
(以上不知關念是否有誤!!)

===================引 用 lu 文 章===================
不客氣~~只是好奇的問一下,你需要能同時連上幾個Connection才夠阿?
一般來說類似的程式,是資料處理完成後就 Disconnect 了,THREAD結束後就把 該物件給DELETE掉了
64個CONNECTION,怎麼會不夠用勒?
偶寫的APPLICATION SERVER用10個Connection 就可以處理將近100個遠端DEVICE的資料傳送及連線了...
lu
高階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-05-17 09:56:27 IP:203.73.xxx.xxx 訂閱
1. 但如果 DEVICE 同時有資料時,又要 開開關關 ADOConnection Connection 
ANS:應該不會出問題,如果你有接觸過ASP的話,M$ 的建議示每一頁都產生一個 Connection、連線最後斷線再DELETE

2.所以我想是每個 THREAD 用 ADOQuery? 連到同一個 ADOConnection? 做處理,
ANS:這個方式偶搞過,最後的結果是....不盡理想(就是在操作資料庫時偶而會發生 Exception),不過當時因為程式都還在發展中,所以不排除是其他BUG導致

3.在非真正多工的環境下,THREAD 是應該是一種排程,而非同時在運作處理,
ANS: YES 你說的對......你說的這個東西,在WIN31時代大概是正確低(偶沒接觸過WIN31,若有錯誤請各位大大指正)
但是.....你現在用的WINDOWS是屬於先佔式多工,簡單說,你若產生10個THREAD,那就是10THREAD『同時』一起RUN,請注意是『同時』一起RUN

4.在非真正多工的環境下,THREAD 是應該是一種排程,而非同時在運作處理,
也因此我想如果每個 THREAD 在 ADOQuery?Open ?--> 新增資料 --> ADOQuery??Close ,
當它是必需完成後,其它的 THREAD 才可以做新增資料(這樣的一個流程)的動作的話。
應該沒有 資料鎖定 或 新增資料失敗的問題。
ANS: 那你幹嘛寫 Multi Thread 的程式,寫SINGLE THREAD的程式就好了阿.......若開一個Thread 還等其他程式做完才可以RUN,那....幹嘛用THREAD
給你一個建議,去找本Operate System 的書,稍微翻一下,你才會有整體的觀念

5. 由你的說法中,大概可以推測,你對THREAD還不是非常熟悉,建議你先去找本MULTI THREAD的書先看一看,然後再來寫程式,以免到最後程式當到哪裡去都不知道


===================引 用 salo0610 文 章===================
有數個 DEVICE(硬体),與PC連線的方式多種( comport 、 socket....) ,
這些 DEVICE 遇到狀況時,可能會傳一筆資料回來 PC,當PC 收到這些資料時要將這些資料做儲存,
因此想用 THREAD 分別去處理這些 DEVICE 的 Connect? 及資料寫入資料庫,
雖然在沒有資料 可以 Close ADOConnection Connection ,
但如果 DEVICE 同時有資料時,又要 開開關關 ADOConnection Connection (<--我想這會出問題的吧)
所以我想是每個 THREAD 用 ADOQuery? 連到同一個 ADOConnection? 做處理,
但也不知 這樣做是不是會有問題~
當然希望可以連線的DEVICE 越多越好啊!!

ps:
在非真正多工的環境下,THREAD 是應該是一種排程,而非同時在運作處理,
也因此我想如果每個 THREAD 在 ADOQuery?Open ?--> 新增資料 --> ADOQuery??Close ,
當它是必需完成後,其它的 THREAD 才可以做新增資料(這樣的一個流程)的動作的話。
應該沒有 資料鎖定 或 新增資料失敗的問題。
(以上不知關念是否有誤!!)
編輯記錄
lu 重新編輯於 2007-05-17 09:59:19, 註解 無‧
salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-05-17 10:33:37 IP:220.132.xxx.xxx 未訂閱
謝謝 lu 大大回覆!!

1. 但如果 DEVICE 同時有資料時,又要 開開關關 ADOConnection Connection?
ANS:應該不會出問題,如果你有接觸過ASP的話,M$ 的建議示每一頁都產生一個 Connection、連線最後斷線再DELETE
這是一個方法,但每次一有資料就要在 new ADOConnection ,然後 在 Connection ,這速度來說應該有點慢,當然希望一個 sectoin 一直開著,
這樣子新增、修改 速度比較快,且如你所說 "THREAD 會同時一起RUN" ,那上次說到的六十四個 ADOConnection Connection,可能就會發生,
因為如果同時大於六十四個 DEVICE 有資料進來時,就會有大於六十四個 ADOConnection Connection 的問題。


2.所以我想是每個 THREAD 用 ADOQuery? 連到同一個 ADOConnection? 做處理,
ANS:這個方式偶搞過,最後的結果是....不盡理想(就是在操作資料庫時偶而會發生 Exception),不過當時因為程式都還在發展中,所以不排除是其他BUG導致
所以我才提出來問各個大大的經驗啊!!,謝謝你的經驗分享

3.在非真正多工的環境下,THREAD 是應該是一種排程,而非同時在運作處理,
ANS:?YES 你說的對......你說的這個東西,在WIN31時代大概是正確低(偶沒接觸過WIN31,若有錯誤請各位大大指正)
但是.....你現在用的WINDOWS是屬於先佔式多工,簡單說,你若產生10個THREAD,那就是10THREAD『同時』一起RUN,請注意是『同時』一起RUN
是這樣子的啊,我以為要用多核心的cpu,或多cpu 的電腦,才會同時一起 run,我真是關念錯誤 ~~ 羞!!

4.在非真正多工的環境下,THREAD 是應該是一種排程,而非同時在運作處理,
也因此我想如果每個 THREAD 在 ADOQuery?Open ?--> 新增資料 --> ADOQuery??Close ,
當它是必需完成後,其它的 THREAD 才可以做新增資料(這樣的一個流程)的動作的話。
應該沒有 資料鎖定 或 新增資料失敗的問題。
ANS: 那你幹嘛寫 Multi Thread 的程式,寫SINGLE THREAD的程式就好了阿.......若開一個Thread 還等其他程式做完才可以RUN,那....幹嘛用THREAD
給你一個建議,去找本Operate System 的書,稍微翻一下,你才會有整體的觀念
用 Multi Thread 是因為要分別去處理 DEVICE 的 Connect ,及接收它的資料,( 如果多台DEVICE 且連線方式又不是一種的情況下,不用 Multi Thread ,我也不知怎麼寫)
是因為要寫到資料庫的問題(資料鎖定或新增資料失敗),才會因此有上述想法,
但 "開一個Thread 還等其他程式做完才可以RUN" ,這又不是一直發生,而是要Thread 要寫資料到資料庫時才會發生(每個 DEVICE 不是一直持續有資料),
平常沒資料,各別的 Thread 不用等其他程式做完才可以RUN 啊!! ,
且如果要送資料(指令)與DEVICE溝通時 ,平常沒有資料要寫入時,各別的 Thread 也可以獨立運作啊!!


5. 由你的說法中,大概可以推測,你對THREAD還不是非常熟悉,建議你先去找本MULTI THREAD的書先看一看,然後再來寫程式,以免到最後程式當到哪裡去都不知道
嗯!! Thread 的程式 第一次寫,且不是粉熟!! 且MULTI THREAD 真得粉難 debug!! :( WU~WU~WU~WU~
lu
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-05-17 12:46:39 IP:203.73.xxx.xxx 訂閱
1.因為如果同時大於六十四個 DEVICE 有資料進來時,就會有大於六十四個 ADOConnection Connection 的問題。
呵呵~~你陷入一個迷思了,重點是為啥一個DEVICE就要一個ADOConnection? 前面有說到,資料庫的連線是要COCO低(以M$ 的SQL SERVER,一個Connection 偶記得大約是4、5千台幣吧),就算你是用ACCESS,沒有授權費用,但是也不太可能無上限一直產生ADOConnection,所以~~重點是,為啥不能多個DEVICE共用少數的ADOConnection

一般來說寫類似網路連線的程式,都有所謂同時連線或同時處理資料數量的限制,舉例來說,我寫一隻程式可以允許1000個DEVICE連線,但是同一個時間,程式限制只能處理5個DEVICE送過來的資料,你問~~若超過5個一起送資料過來,怎麼辦?~~簡單一句話~~排隊,或許你會再問,5個夠嗎?其實實務運作上,同時允許處理10~50個DEVICE送過來的資料,大概差不多可以把CPU佔滿了(視你程式碼複雜度而言),不知你是否有玩線上遊戲,一台SERVER可以負荷同時上線人數大多是1000人左右,那一台SERVER價格是數十萬至百萬,你用一般的PC想要同時處理上百甚至上千個DEVICE,可能嗎?

2是這樣子的啊,我以為要用多核心的cpu,或多cpu 的電腦,才會同時一起 run,我真是關念錯誤 ~~ 羞!!
若是單核心的CPU,同一時間,CPU也只能處理一件事,但是OS會快速的切換至其他的工作,讓使用者看起來好像所有是同時進行

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