多個執行緒,多個ADOQuery , 是否可行? |
答題得分者是:lu
|
salo0610
高階會員 發表:42 回覆:120 積分:107 註冊:2003-02-18 發送簡訊給我 |
各位大大您們好:
小弟有一事想請問各位大大,不知這樣做是否可行?? 程式動態產生多個執行緒,並傳送一個 ADOConnection 指標給它,(表示執行緒共用同一個 ADOConnection 連 Access 資料庫[mdb] ) 每個執行緒有一個ADOQuery Connection 到 ADOConnection, 每個執行緖有新增資料到某一個 table 的動作(每個執行緒都是新增到這個 table)。 我是想請問一下,這樣子情況下,當執行緒 一多時,會不會有問題?? 或者問說 ADOConnection 元件可以給多少個 ADOQuery Connection ?? 若有相關經驗的大大,是否可以提供一些意見,謝謝!! |
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
根據我個人的經驗(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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
呵!! 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 發送簡訊給我 |
呵!! 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 發送簡訊給我 |
不客氣~~只是好奇的問一下,你需要能同時連上幾個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 發送簡訊給我 |
有數個 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 發送簡訊給我 |
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 發送簡訊給我 |
謝謝 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 發送簡訊給我 |
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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |