我的需求
我使用 Delphi/C++Builder XE2。
我至少需要访问这些DBMS:
- Firebird
- DB2/400
- SQL Server
- SAP HANA(一种新的内存数据库,可用接口(interface):JDBC、ODBC、ODBO、SQLDBC)
我需要在数据感知可视控件中显示和编辑数据。 数据可以驻留在这些 DBMS 中的任何一个上,我将在外部文本文件上配置连接属性和 SQL 语句。
所以我正在寻找一组用于数据库访问的组件,它支持此类 DBMS 并且具有良好的性能,类似于旧的 Paradox 表。
我的猜测
- 使用 ODBC 性能会比使用 native 驱动程序差。如果属实,我该如何解决这个问题?
- 即使通过 ODBC,HANA 内存数据库的性能也会很好(我现在无法测试)。
到目前为止我发现了什么
BDE (Borland 数据库引擎) (
TDatabase
,TTable
...)已弃用。
DBX(Embarcadero dbExpress)(
TSQLConnection
,TSQLTable
...)替换 BDE,单向数据集(光标只向前移动;不在内存中缓冲数据,这样的数据集不能在 DBGrid 中显示;要使用 dbExpress 构建用户界面,您将需要使用另外两个组件:
TDataSetProvider
和TClientDataSet
)使用 native 驱动程序(HANA 没有)或 ODBC。
FireDAC (Embarcadero Fire 数据访问组件)(
TADConnection
、TADTable
...)这是AnyDAC的延续;使用 native 驱动程序(HANA 没有)或 ODBC 或 dbExpress。
UniDAC (Devart 通用数据访问组件)
不是免费的;使用 native 驱动程序(HANA 没有)或 ODBC 或“数据库客户端”。
DA(RemObjects Data Abstract 用于 Delphi)
不是免费的。
ZDBC (Zeos 数据库连接接口(interface))(
TZConnection
、TZQuery
...)开源;开始作为 JDBC 到 Object Pascal 的端口;不提供与数据感知可视化控件的绑定(bind)。
dbGo (Embarcadero dbGo) (
TADOConnection
,TADOTable
...)实现 ADO(因此在 OLE DB 和 ODBC 之上)。有许多怪癖,例如在查询中重复使用同名参数。
Jv BDE (
TJvQuery
,TJvBDESQLScript
...)相应标准库的增强。
Jv 数据访问(
TJvADODataset
、TJvADOQuery
...)相应标准库的增强。
(随意增强此列表)
所以我的选择是:
- dbExpress 还是 FireDAC: future Embarcadero 将何去何从?
- dbGo:ADO 是个不错的选择吗?好像是依赖ODBC,那么性能呢?
- 像 UniDAC 或 Data Abstract 这样的商业产品:有必要吗?会更好吗?
最佳答案
我决定进行一些性能研究:UniDAC (5.0.1) 与 FireDAC (8.0.1),在 Delphi XE3 上。数据库:Firebird、MySQL 和 SQL Server。
这里是 150k 记录的抓取结果(内存使用被认为是抓取前后的差异)。
Firebird :
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT TIMESTAMP
)
UniDAC - 0,909 秒,占用 12 324 044 内存
FireDAC - 0,967 秒,占用了 282 179 668 内存(我很震惊)
MySQL:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT DATETIME
)
UniDAC - 0,363 秒和 11 552 604 内存
FireDAC - 0,713 秒和 49 375 108 内存
SQL服务器:
CREATE TABLE TEST_PERF (
ID INTEGER PRIMARY KEY,
VC VARCHAR(200),
NM NUMERIC(18,2),
DT DATETIME
)
UniDAC - 0,391 秒和 14 155 576 内存
FireDAC - 0,324 秒和 51 775 844 内存
一切都经过简单测量:
function MemoryUsed: Cardinal;
var
st: TMemoryManagerState;
sb: TSmallBlockTypeState;
begin
GetMemoryManagerState(st);
Result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;
for sb in st.SmallBlockTypeStates do
Result := Result + sb.UseableBlockSize * sb.AllocatedBlockCount;
end;
UniQuery1.SQL.Text := 'select * from test_perf';
UniQuery1.SpecificOptions.Values['FetchAll'] := 'True';
mem := MemoryUsed;
tc := Now;
UniQuery1.Open;
UniQuery1.Last;
tc := Now - tc;
mem := MemoryUsed - mem;
Memo1.Lines.Add('UniDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));
ADQuery1.SQL.Text := 'select * from test_perf';
ADQuery1.FetchOptions.Mode := fmAll;
mem := MemoryUsed;
tc := Now;
ADQuery1.Open;
ADQuery1.Last;
tc := Now - tc;
mem := MemoryUsed - mem;
Memo1.Lines.Add('FireDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));
如果有人感兴趣,这里是test application ,您可以在其中添加 ADO、dbExpress、ZeosLib 和您感兴趣的其他软件的性能比较。
关于database - 从 Delphi XE2 高效访问各种 DBMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16016700/