2013/08/19

Dbexpress driver is Thread Safe?

這陣子在為Dbexpress Driver for SQL Server的選擇在測試著,進行到Debug DataSetProvider.OnBeforeUpdateRecord事件時,卻意外的發現各家的Driver在對Thread使用上的處理都不盡相同,於是做了點小小的研究。


EMBT's Dbexpress driver for SQL SERVER:
特性:條件被動式的Thread Safe。
說明:
EMBT自製的DBX Driver一直都很妙,在Bug和穩定性間都能維持一個絕佳的平衡點。 (笑)
手冊上對Thread應用是這麼寫的:
1.VCL Application不需要另外呼叫CoInitializeCoUninitialize,因為EMBT已經很好心的寫在framework中 (VCL applications take care of these calls for you, so VCL applications do not require calling CoInitialize and CoUninitialize.)
2.Console Application一定要自己呼叫ConInitializeCoUninitialize,不然在呼叫App時系統會直接送你一個Error啦。

***這條件不查手冊永遠都不會知道的……偏偏這方面的資料幾乎為 0 ......

Open Dbexpress for SQL SERVER:
特性:主動式的Thread Safe。
說明:
因為直接依賴ODBC Library本身的功能,所以Developer必須了解對應的Library有沒有Thread Safe的處理。
OleDB:基於COM的實作,所以必需自行加入CoInitialize 和 CoUninitialize
SQL Native Client: 基於.NET,所以.NET會自動處理Thread Safe (.NET太棒啦!)

***不過如果沒CoInitialize/CoUninitialize時程式也是正常運作,就等著讓Application爆了再說。(喂喂……)

Devart Dbexpress driver for SQL SERVER:
特性:智慧型的Thread Safe。
說明:
Devart公司所開發的DBX Driver是基於COM的產品,也是唯一仍然使用COM開發DBX Driver的廠商。完全相容OleDB和SQL Native Client模式,也應該是最高效的Driver了!

實作上,在Main Thread中,完全不需要CoInitialize/CoUninitialize,程式一切正常。
在Other SubThread操作DBX元件(TSQLQuery/TSQLTable/TSQLDataSet...etc)時,如果沒加上CoInitialize/CoUninitialize,Driver會很貼心的訊息提醒Developer:
貼心的開發提示

*****所以開發上常忽略的地方得以藉由三方廠商的支援得以更佳周全。所以一定要推Devart一下的啦!

以上便是Eden小小的研究心得 ^___^


沒有留言:

張貼留言