12

我的需求

我使用 Delphi/C++Builder XE2。

我至少需要访问这些DBMS

  • 火鸟
  • DB2/400
  • SQL 服务器
  • SAP HANA(一个新的内存数据库,可用接口:JDBC、ODBC、ODBO、SQLDBC)

我需要在数据感知可视控件中显示和编辑数据。数据可以驻留在这些 DBMS 中的任何一个上,我将在外部文本文件上配置连接属性和 SQL 语句。

因此,我正在寻找一组支持此类 DBMS 并具有良好性能的数据库访问组件,类似于旧的 Paradox 表。

我的猜测

  1. 使用 ODBC 性能将比使用本机驱动程序差。如果属实,我该如何克服这个问题?
  2. 即使通过 ODBC,HANA 内存数据库的性能也会很棒(我现在无法测试)。

到目前为止我发现了什么

  • BDE (Borland 数据库引擎) (TDatabase,TTable...)

    已弃用。

  • DBX (Embarcadero dbExpress ) ( TSQLConnection, TSQLTable...)

    替换 BDE,单向数据集(光标只在前面;不在内存中缓冲数据,这样的数据集不能在 DBGrid 中显示;要使用 dbExpress 构建用户界面,您需要再使用两个组件:TDataSetProviderTClientDataSet

    使用本机驱动程序(HANA 没有)或 ODBC。

  • FireDAC(Embarcadero Fire 数据访问组件)(TADConnection...TADTable

    这是AnyDAC的延续;使用本机驱动程序(HANA 没有)或 ODBC 或 dbExpress。

  • UniDAC(Devart 通用数据访问组件)

    不是免费的;使用本机驱动程序(HANA 没有)或 ODBC 或“DB 客户端”。

  • DA( Delphi 的RemObjects数据摘要)

    不是免费的。

  • ZDBC (Zeos 数据库连接接口) (TZConnection,TZQuery...)

    开源;开始作为 JDBC 到 Object Pascal 的一个端口;不提供与数据感知可视控件的绑定。

  • dbGo (Embarcadero dbGo) (TADOConnection,TADOTable...)

    实现 ADO(因此通过 OLE DB 通过 ODBC)。有许多怪癖,例如在查询中重复同名参数。

  • Jv BDE ( TJvQuery, TJvBDESQLScript...)

    相应标准库的增强。

  • 合资数据访问 ( TJvADODataset, TJvADOQuery...)

    相应标准库的增强。

(请随时增强此列表)

所以我的选择是

  • dbExpress 或 FireDAC:Embarcadero 未来将走向何方?
  • dbGo:ADO 是一个不错的选择吗?貌似它依赖于ODBC,那么性能呢?
  • 像 UniDAC 或 Data Abstract 这样的商业产品:有必要吗?会更好吗?
4

5 回答 5

9

我决定在 Delphi XE3 上进行一些性能研究:UniDAC (5.0.1) 与 FireDAC (8.0.1)。数据库:Firebird、MySQL 和 SQL Server。

这是 150k 条记录的提取结果(内存使用量被认为是提取前后的差异)。

火鸟:

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));

如果有人感兴趣,这里是测试应用程序,你可以添加 ADO、dbExpress、ZeosLib 和其他你感兴趣的性能比较。

于 2013-05-21T11:03:48.667 回答
3

如果您使用的是 XE2,我会推荐 dbExpress。

  • 它支持 ODBC(但不支持 SAP HANA)
  • 单向数据集可以与 ClientDataSet 一起用于缓存。事实上,ClientDataSets 可用于缓存任何数据集组件。

如果您使用的是 XE3 或更高版本,我会推荐 FireDAC。

  • Embarcadero 收购了 AnyDAC 并将其重命名为 FireDAC。
  • 它包含在 Enterprise SKU 及更高版本中。获得许可的 XE3 用户可以免费下载。
  • 我相信这将是他们未来的数据访问策略。请参阅此最近的博客文章

我知道 FireDAC 可以与 XE2 一起使用,但我不确定是否有任何问题。

于 2013-04-15T14:40:18.237 回答
2

总是使用 ADO——将它与 SQLServer、Oracle、Sybase、PostGreSQL 等一起使用。您几乎可以为任何数据库找到 ADO 提供程序。从来没有遇到过我无法通过一些研究解决的问题。由于 ADO 应用如此广泛,因此大多数问题都是众所周知的。UDL 文件可以让您的生活更轻松。

但是我从不在组件面板上使用 Delphi ADO 组件——要么我在内存中使用它们,要么更经常地将 ADO 调用的结果直接转储到 TKBMMemtable 中,并完全避免使用 Delphi 的“开箱即用”的东西。您可以编写一个实用函数来自动为您执行此操作。

于 2013-04-16T02:47:46.047 回答
0

Firedac-带有Delphi,因此无论如何您可能都必须为此付费。UNidac-Faster 让你不用那么频繁地升级Delphi,为了让数据Acess不断更新,如果你有一天决定去Lazzarus你也省了很多工作。

于 2016-09-06T23:05:27.410 回答
-2

许多线程中有很多误解,所以我会尝试给我的 2 美分。问题是我们 Delphian 过去思考过executables,所以我们寻找移动数据的方法(特别是当我们的数据库和应用程序服务器托管在外部时);这些场景永远不会击败RIA应用程序,因为您不再移动数据,而只是屏幕的表示。另一个误解是说TDATASET不能很好地与AJAX. 只是看一些UNIGUI例子youtube。顺便说一句,我使用的是普通DataSnapclientdataset,而不是 ORM。

于 2016-07-12T23:34:41.903 回答