2009/02/11

當 C++ Builder 遇上 Firebird

最近將自己專案裡所連結的Database由 BDE的 Parabox變更為 Firebird,而連結方式也由萬年不化的 BDE,改成由當時 Borland主推的 dbExpress來連結。

當初在做設計變更時,針對這個程式,我想要:
1. 切換到 MySQL、MS SQL、Oracle等之類的SQL資料庫能夠短時間修改完成
2. 封裝時能夠更簡潔
3. 嚐試更新的資料庫程式設計
4. 未來在變為 Multi-Tier架構時較能無痛升級

事實上,就是一個字 --「爽」!

反正…對dbExpress就是很嚮往,我就是要改就對了。

話說,Paradox是屬於「單機檔案型資料庫」而 Firebird是屬於「SQL型資料庫」,也就是說,必須裝個服務(SERVICE)才能夠使用。
這可怎麼辦才好呢?

這時突然看到「Embedded」--將SQL指令封裝在一個 dll檔案中,做為DB與程式間的橋樑,在單機的環境中就不須安裝服務了。

「做得非常好呀!」

Embedded中有三個產品 -- SQLite、Berkeley DB、Firebird embedded 三個。

Berkeley DB就不用看了,為了提高效能而完完全全的使用API來處理。
(等我開新專案時再來考慮)

SQLite 則有Borland的三方 DBX Driver,但使用上 bug一堆 (最明顯的是Refresh後資料庫連線會斷開,而且必須重開應用程式才能連上),連自帶的demo也開不了內附的db……什麼鬼!

最後就是 Firebird Embedded,其實主要的好處就是與 Interbase相通,ib的 dbx driver可以直上 Firebird,很方便!

於是乎,就開始將程式修改連結方式,一直到…

「咦!2.1.0出了耶,趕快來更新!」

不更新還好,一更新…

「哇哇哇!我table的合併顯示出不來了!」

在 DBX上的操作開始出狀況了,於是…又改回為1.5.5.......

1.5.5很好嗎?
只要 「fbembed.dll」、「ib_util.dll」這兩個檔案就可以啟動,有沒有很好?當然好!
但在壓力測試時,在總筆數達4萬筆後…

450mb突破!

什麼鬼!最好是能暴增到這麼多啦!
而且效能變得更差! 在這之後,每 insert into 1筆資料,需要

5~10秒!

真是驚死人的數據!而且無解……
怎麼辦…程式改完才出現這樣的情況…

而且,這不是C++ Builder的問題哦,因為在FB專用的gui管理工具所呈現的,也是一樣出乎意料的慢,所以這應該是 FB 1.5.5的問題。

在不得已的情況下,只好再試試看 FB最新的 2.1.1版了。
將450MB的DB匯出 SQL檔,然後再輸入到新的FB2.1.1 DB中(這個工作就花了8個小時...)

多少?

3 MB

…一整個無言,而且效能上依舊犀利

那就繼續用 BCB6 + FB 吧……

沒有留言:

張貼留言