2021/04/26

Dbexpress (DBX) Factory for SQL SERVER

之前在這篇【那些年 DBeXpress 所教我的事:DBXCommon 單元】文章中提到 DBXCommon 是 Dbexpress (以下簡稱 DBX) 最底層的單元,像是 TDBXCommand 和 TDBXReader 便是 TSQLQuery 等 DBX DataSet 所包裝的內容,同時也是 DataSnap 底層架構,所以掌握 TDBXReader 就可說是掌握 DataSnap 效能這件事一點都不為過。


大匠文章的【Delphi 特規 JSON 和 JavaScript Object 1+2】中得知:

  • TDataSet 可以轉回 TDBXReader。
  • DBX DataSet 在取得資料集時也是在底層先建立 TDBXReader 才轉到 TSQLQuery。

如果要增加轉換效率,那直上 TDBXReader,就可以省下底層到 TDataSet 轉換的工作。

於是就有了 Dbexpress (DBX) Factory for SQL SERVER 單元的誕生,這是大匠在 WEB 實戰中構築出的 DBX 工廠,針對轉換 JSON 的前置工作進行最佳化的處理。

附帶說明,如果要轉換給 ClientDataSet,有兩種方式

  • TDBXDataSetReader.CopyReaderToClientDataSet / ToClientDataSet
  • TDataSetProvider.Data To ClientDataSet

TDBXDataSetReader.CopyReaderToClientDataSet 會依照欄位內容依序建立 MyBase 的 TClientDataSet,少了 TDataSetProvider 的再轉換,有較佳的效能,但會缺少 TClientDataSet 內的部份內置屬性,如 TableName、PrimaryKey 等。

TDataSetProvider 是老方法,並不適合用在 JSON 傳輸上,但有完整建構需求還是得透過 TDataSetProvider 進行轉換,才能得到最完整的 TClientDataSet。

What is DBX Factory?

DBX Factory 主要用途是在 DataSnap 中扮演轉換為 JSON 前的 TDBXReader 製造工廠,在無狀態架構下能夠用最少的程式碼並高效產出資料集。

如何使用 DBX Factory?

Factory 建立方式

var DBXFactory: TDBXMSSQLFactory.Create('127.0.0.1', 'ADBDEMOS', 'Eden', 'IL@veEden');
try
  /// do something
finally
  DBXFactory.Free;
end;


執行無返回資料集 SQL Command 方式

var DBXFactory: TDBXMSSQLFactory.Create('127.0.0.1', 'ADBDEMOS', 'Eden', 'IL@veEden');
try
  var RowsAffected: Integer = DBXFactory.Execute('UPDATE employee SET LastName = ''Eden'' WHERE id= 1 ');
finally
  DBXFactory.Free;
end;


執行無返回資料集 SQL Command 帶參數方式

var DBXFactory: TDBXMSSQLFactory.Create('127.0.0.1', 'ADBDEMOS', 'Eden', 'IL@veEden');
try
  var RowsAffected: Integer = DBXFactory.Execute('UPDATE employee SET LastName = :LastName WHERE id= :id ', ['Eden', 1]);
finally
  DBXFactory.Free;
end;


執行含返回資料集 SQL Command 方式

var DBXFactory: TDBXMSSQLFactory.Create('127.0.0.1', 'ADBDEMOS', 'Eden', 'IL@veEden');
try
  var DBXReader: TDBXReader = DBXFactory.ExecuteQuery('SELECT * FROM employee');
/// do something 
finally
  DBXReader.Free;
  DBXFactory.Free;
end;


執行含返回資料集 SQL Command 帶參數方式

var DBXFactory: TDBXMSSQLFactory.Create('127.0.0.1', 'ADBDEMOS', 'Eden', 'IL@veEden');
try
  var DBXReader: TDBXReader = DBXFactory.ExecuteQuery('SELECT * FROM employee WHERE id=:id', [1]);
/// do something 
finally
  DBXReader.Free;
  DBXFactory.Free;
end;


搭配 DB Pooling 時

DB Pooling 是一個在 Web + RDBMS 開發時很重要的要素,可以讓許多短連接共用資料庫連線。

DBX Factory 已經用到接近 Driver 層的內容,但有很多會依賴 Driver 處理的程式,也由於每家 Driver 不盡相同,所以有些手動的工作,如 Close 等就要小心處理。

以下幾個需要注意的地方:

 

  • TDBXConnectionFactory 不需 Free,若人工釋放會造成二次釋放而產生 Access Violation。
  • TDBXConnection 不需 Close,交由 Destory 事件給 DBX 判定處理即可,若人工關閉會造成二次釋放而產生 Access Violation。
  • TDBXCommand 釋放時會處理 Close,人工關閉不影響,但 Destory 事件也會判斷一次,建議交給 DBX 處理。

因為已經在底層作業,一個不小心會造成 Memory Leak 的可能,請多加留意。


以上資訊和你分享!


See alse

沒有留言:

張貼留言