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

嵌入式 firebird embed 是否支援 MultiThread

答題得分者是:aftcast
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-16 14:28:13 IP:61.222.xxx.xxx 訂閱
firebird embed 是以 Single Process 獨佔方式開啟。
那麼如果 以 Single Process MultiThread 每一個Thread 連線是否可以?及是否有任何限制呢?

另外我如果使用 Delphi5 的 InterBase 元件讀取 FireBird 2.1 embed 是否會有問題?

感謝指教!謝謝。
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-16 15:34:46 IP:203.75.xxx.xxx 訂閱
呵呵
對岸的同好已經有測試過這類的方法
其答案是……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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-16 16:11:29 IP:61.222.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-16 16:28:16 IP:61.222.xxx.xxx 訂閱
感覺上 FireBird Embedded 在處理同一個 Process 是可以擁有多個同時連線。
這方面資料實在太少了。準備撞牆中........ (可惜沒有撞牆的表情符號)
careychen
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-16 17:07:22 IP:60.248.xxx.xxx 訂閱
原來 RootKit 大也在學 FB 呀,之前我也有小摸了一陣子,後來事情多了就先放著了,
我之前是向 GrandRURU 大討教的,有機會跟你們兩位再多多討教討教,其實 RootKit 您碰到的問題跟我差不多
所以小弟很感興趣~~,祝您早日解答 小弟再來偷學一下

===================引 用 RootKit 文 章===================
感覺上 FireBird Embedded 在處理同一個 Process 是可以擁有多個同時連線。
這方面資料實在太少了。準備撞牆中........ (可惜沒有撞牆的表情符號)
------
價值的展現,來自於你用哪一個角度來看待它!!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-16 17:07:47 IP:122.120.xxx.xxx 訂閱
覺得題目有點不精準,所以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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-16 17:55:15 IP:122.120.xxx.xxx 訂閱
個人覺得檔案形式的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
編輯記錄
aftcast 重新編輯於 2008-10-16 18:07:54, 註解 無‧
aftcast 重新編輯於 2011-03-19 11:52:37, 註解 無‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-16 19:29:49 IP:122.126.xxx.xxx 訂閱
在我想來 Multi-Connection連結支持必然也應該具有 MultiThread 處理能力。
可能我的主題不明確把Midas 想在一塊。

接下來我會實際測試 GrandRURU 兄所言部分。
...
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-16 20:18:36 IP:122.126.xxx.xxx 訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-10-22 14:50:34 IP:61.222.xxx.xxx 訂閱
被別的事情打岔,繼續測試之路。....

依據 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-10-23 06:08:31 IP:59.115.xxx.xxx 訂閱
我倒不是這麼認為你找打,而且還覺得是個好題目。本來我是都用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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-10-24 16:33:55 IP:61.222.xxx.xxx 訂閱
先前想得太複雜,變得有點白目。
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-10-24 21:00:20 IP:122.126.xxx.xxx 訂閱
從來不知道 ACCESS 可以慢到如此境界。多執行緒同步還會卡死。
比 FireBird 慢上十幾倍。不可思議......

搞了半天還是費時費力的把它Try出來。
先暫時這樣吧。.....
careychen
尊榮會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-10-24 21:02:03 IP:59.126.xxx.xxx 訂閱

===================引 用 RootKit 文 章===================
從來不知道 ACCESS 可以慢到如此境界。多執行緒同步還會卡死。
比 FireBird 慢上十幾倍。不可思議......

搞了半天還是費時費力的把它Try出來。
先暫時這樣吧。.....
------
價值的展現,來自於你用哪一個角度來看待它!!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-10-24 21:24:02 IP:60.248.xxx.xxx 訂閱
謝謝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
編輯記錄
aftcast 重新編輯於 2008-10-24 21:41:10, 註解 無‧
aftcast 重新編輯於 2008-10-24 21:42:59, 註解 無‧
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-10-25 13:23:56 IP:59.127.xxx.xxx 未訂閱
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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2010-11-25 09:32:05 IP:203.75.xxx.xxx 訂閱
最近也在不願意的情況下測試了 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, 註解 補上來源網扯‧
系統時間:2024-11-21 16:44:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!