嵌入式 firebird embed 是否支援 MultiThread |
答題得分者是:aftcast
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
呵呵
對岸的同好已經有測試過這類的方法 其答案是……FB的EMBEDDED對多執行緒不支援! 沒用過D5這麼早之前的版本… 我是用BCB6的DBX來連 FB 2.1 ,但不是很穩 所以後來又連回1.5 ===================引 用 RootKit 文 章=================== firebird embed 是以 Single Process 獨佔方式開啟。 那麼如果 以 Single Process MultiThread 每一個Thread 連線是否可以?及是否有任何限制呢? 另外我如果使用 Delphi5 的 InterBase 元件讀取 FireBird 2.1 embed 是否會有問題? 感謝指教!謝謝。 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
3Q 回覆。
我實際測試一下卻是有不同的結論。初步答案是可以的。 我測試的過程,嘗試建立一 TWorkThread 並在 Execute 中建立連線 例如: var IBDb1: TIBDatabase; IBTA1: TIBTransaction; IBQY1: TIBDataSet; begin IBDb1 := TIBDatabase.Create(Nil); IBTA1 := TIBTransaction.Create(Nil); IBQY1 := TIBDataSet.Create(Nil); Try Try IBTA1.DefaultDatabase := IBDb1; IBQY1.Database := IBDb1; IBQY1.Transaction := IBTA1; IBDb1.DefaultTransaction := IBTA1; IBDb1.DatabaseName := ExtractFilePath(ParamStr(0)) 'DB.FDB'; IBDb1.LoginPrompt := False; IBDb1.Connected := True; 新增了 5000 筆隨機資料。 ... ..... IBTA1.CommitRetaining; IBQY1.Close; IBDb1.Close; Except end; Finally IBQY1.Free; IBTA1.Free; IBDB1.Free; end; 我同時開啟了5個 WorkThread 。並沒有發生錯誤!像是另外一程式開啟會出現另一支程式在使用的錯誤訊息。 資料也確實有寫入進去,但實際可能還需測試同步及效率的情形,。.... 不過令人感到奇怪的事當 5個 WorkThread 已做完。 在主視窗有另外一個 Database 連接 DBGrid 嘗試刷新並沒有新增資料。 反而需結束程式後再次開啟才會跑出新增的資料。 目前還在摸索中,以前用慣 ADO BDE 改成 IB 真是不習慣。 如有錯誤地方,請多多指正。 ===================引 用 GrandRURU 文 章=================== 呵呵 對岸的同好已經有測試過這類的方法 其答案是……FB的EMBEDDED對多執行緒不支援! 沒用過D5這麼早之前的版本… 我是用BCB6的DBX來連 FB 2.1 ,但不是很穩 所以後來又連回1.5 ===================引 用 RootKit 文 章=================== firebird embed 是以 Single Process 獨佔方式開啟。 那麼如果 以 Single Process MultiThread 每一個Thread 連線是否可以?及是否有任何限制呢? 另外我如果使用 Delphi5 的 InterBase 元件讀取 FireBird 2.1 embed 是否會有問題? 感謝指教!謝謝。 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
原來 RootKit 大也在學 FB 呀,之前我也有小摸了一陣子,後來事情多了就先放著了,
我之前是向 GrandRURU 大討教的,有機會跟你們兩位再多多討教討教,其實 RootKit 您碰到的問題跟我差不多 所以小弟很感興趣~~,祝您早日解答 小弟再來偷學一下 ===================引 用 RootKit 文 章=================== 感覺上 FireBird Embedded 在處理同一個 Process 是可以擁有多個同時連線。 這方面資料實在太少了。準備撞牆中........ (可惜沒有撞牆的表情符號)
------
價值的展現,來自於你用哪一個角度來看待它!! |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
覺得題目有點不精準,所以GrandRuRu的答覆和你的講法有點雞同鴨講…
題目應該改成 Firebird embed是否支援 CONCURRENT multi- CONNECTION in A process? 資料庫是否multithread其實重點在server concurrent connection數量。並非指client ap本身是否multithread。 當資料庫非multithread時,表示它同時間只能建立一個connection。所以當client ap同時間要求n個請求時,他只能把n-1個hold住(有可能會time out)。 因此,GrandRuRu的答覆應該沒錯,而rootkit的實驗也沒錯。一個在講server本身的mutithread問題,一個是講ap是否可以multithread。然而,考慮ap的multithread問題是比較不重要的,重點還是在server上的concurrent connection!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-10-16 17:11:03, 註解 回完訊息後發現RootKit已經自己回應了…‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
個人覺得檔案形式的db是否可以multi-connection決定在database engine身上。一般來說既然強調是小型或是個人db,就不太可能去實做multithread。一但有實做multithread的資料庫,就可稱為DBMS,如MSSQL類的。又如access,Jet Engine 只會實做lock整個file,不會實做多同時連線。若有需要,他會請你用SQL Server。
我想目前的DBX或是IB Expert 之類的database engine應該不會實做交易機制,不過,也有可能可以自己實做database engine。但得先去了解它的file 結構,然後自行處理query, add, upadte, delete.... 並適當的lock衝突交易。 曾在dos下以c語言實做對xBase(dbf)的直接query。就是用這樣的方式。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
SuperServer is a single-process multi-threaded server
Classic is a multi-process single-threade server things are synced via a separate lock manager process Embedded is a DLL you hook up to your application and work with database file directly.
編輯記錄
RootKit 重新編輯於 2008-10-24 16:38:35, 註解 無‧
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
被別的事情打岔,繼續測試之路。....
依據 aftcast 所言 >當資料庫非multithread時,表示它同時間只能建立一個connection。所以當client ap同時間要求n個請求時,他只能把n-1個hold住(有可能會time out)。 實際測試是會集體同時延遲完畢,並非一個一個結束。 此次測試心得如下: 1. 探討 AP-MultiThread或者 DB - MultiThread 似乎對 FireBird 已無太大的意義。 令人感到吃驚的是測試兩者速度差不多是一致的。對嵌入式而言 AP的MultiThread 就是 MultiThread。 除非不支援 MultiConnection。 2. Embedded 與 SuperServer 差別,僅在於單機存取或者網路連線。效能上感覺不出來。 另外 SuperServer 確實為 MultiThread 處理。 3. fbembed.dll 可以當作 fbclient.dll 連線使用,如果有同時向兩者連線的需求。 不過不清楚是否會有後遺症。 結論我個人認為。... 既然是嵌入式,跟MultiThread就沒有什麼關連性。所以我找打。....
編輯記錄
RootKit 重新編輯於 2008-10-22 14:59:00, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我倒不是這麼認為你找打,而且還覺得是個好題目。本來我是都用sqlite,但經過你這麼一發問後,我開始產生了興趣,也研究了幾天。但因工作太煩忙,所以也是暫停一下…
請不要結案,過些天我會再post一些相關的測式或結論。 我目前想了解的是embed的dll到底是否可以multiple connections in A process。若是可以,那麼當我的應用程式是multithread ap時,便可以不改任何程式的分成單機版與網路版(cs架構)。不只是不用改程式碼,就連client端的dll也可以不用換,embed的dll也可以單純用來當c/s架構上的client dll lib。 下面這個連結是我找到重要的reference,有空可以先參考一下 http://www.firebirdsql.org/pdfmanual/Using-Firebird_(wip).pdf 等時間足一點,我會用反組譯模式來追一下embed dll,看他用了什麼,做了什麼。當然,也可以用實作証明,比如開5個thread,第一個啟動的給他很多的寫入動作 讀回動作,第二個則給一次寫入 馬上讀回剛寫的資料,第三個…… 然後在動作完成後跳MessageBox(不能用showmessage)。看是否thread 1沒跑完時,thread2是否就先搞定。若2一定在1之後完成,那就表示…… 請rootkit有空的話可以幫測一下這段,因為我目前沒裝firebird embed Connectity componet 在bcb上。 ===================引 用 RootKit 文 章=================== 既然是嵌入式,跟MultiThread就沒有什麼關連性。所以我找打。....
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
先前想得太複雜,變得有點白目。
OK 。回歸主題。 首先已確認 FireBird Embedded 是支援 Multi-Thread (或Multi-Connection 沒差)。 繼續我測試以下 1. 建立 3 個 Thread 。 2. 第一個Thread 新增 5000 筆,第二個 2000 第三個 500 .... 發現第三個跑最快。.... 表示有超前。 另外發現一點: 若 IBTransaction 使用預設參數(無),將導致Connection 1 寫入後資料在 Connection 2 查不到新的資料。 改成 Read Committed 就無此問題。(被這個問題快搞瘋了....) 希望此次測驗對各位有所助益。... 接下來我將測試與 ACCESS 進行比較速度。待...
編輯記錄
RootKit 重新編輯於 2008-10-24 21:00:55, 註解 無‧
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
謝謝RootKit的測式,收益很多! 看來使用firebird來實現單機與網路版雙用的程式是很適當的!
Access是不support Multiple Connection的。所謂的support的情形不是單指可同時多線連上db,更重要的是DBM(database management,在cs架構上稱server,單機的情形通常不稱server) 能否在每個connection間做"交易調節",for example... conn1 在寫table1 CONN2 也要寫table1 conn3 也要讀table1 server等級的db不用說,都該會調節這3線的交易,或是delay,或是lock… 純單機的就不同,你雖可以每個thread都透過client lib (如 jet) 來連db file,感覺上好似 Multiple Connect上db,但這是沒實值的義意的,因為conn1、conn2、conn3之間所產生的"交易衝突"各自是不知的,且不管的,故會有卡死的情形! 但firebird embed竟是個例外,他的client lib有結合原super server的dll,故而達成真實的Multi-Connection。 推! 真是個很棒的"單機"db ===================引 用 RootKit 文 章=================== 從來不知道 ACCESS 可以慢到如此境界。多執行緒同步還會卡死。 比 FireBird 慢上十幾倍。不可思議...... 搞了半天還是費時費力的把它Try出來。 先暫時這樣吧。.....
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
kadee
高階會員 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
Borland在interbase6版開放成opensource時,我開始用interbase作為
ERP的資料庫後台,目前大概有20個客戶使用firebird1.54。 2007年4月份,我也用 FB emb 寫了一個單機版的進銷存軟體在首頁上 提供使用者免費下載使用。最近也打算將會計總帳系統也改一個單機版 提供免費下載。 FB本來就是 DB engine,只是FB提供一個 emb的dll,可以不用在PC安裝FB service, 直接對 database file 存取 據我所知,emb的dll確實可以當成 C/S 的client 使用。 Delphi 一般可用 ibobjects, UIB...連接 FB,其中和一般熟知的BDE,ADO連接方式 最大不同在FB的個別dataset會有(可以有)個別transation控制。所以在寫程式時 要特別注意transation的控制。 必利得資訊 www.bigredinf.net
------
Kadee/BigRed Ent. www.tw165.com |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
最近也在不願意的情況下測試了 Multi-Thread。
測試的環境是:BCB6 Firebird 2.1 A: Thread * 2 : SQL Update Main Thread * 1 B. Thread * 1 : SQL Update Main Thread * 1 : SQL Select 不論是 A 或是 B 場合,下場不是當機,就是跳出NTDLL.DLL存取錯誤。 到底是怎麼一回事? 以下是摘錄李維老師的敘述: ======================== Gordon Li: dbExpress是一個Thin-Layer over Data Access Engine, 因此是不是Thread-Safe主要是根據你使用的Data Access Engine, 例如MySQL的Client是不是Thread-Safe ? 這你可要查查MySql的文件. 不過不管底層的Engine是不是Thread-Safe(很多都不是Thread-Safe), 只要你的每一個Access Thread都使用獨立的Database Connection, 那麼就可以安全的存取Database. 便如你開發的WebSnap程式存取MySQL, 那麼只要每一個Requesting Thread使用獨立的TSQLConnection(在程式中可動態建立), 那麼就沒有什麼問題. 李維 ======================= 所以要嘛是採worker thread,要嘛是採Multi-Connection 多年來被BDE Enable DataSet is Thread Safe給誤導了 害我以為 DBX Enable DataSet 也是 Thread Safe 真是誤會大了
編輯記錄
GrandRURU 重新編輯於 2010-11-24 18:34:49, 註解 補上來源網扯‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |