mORMot 1.18 第09章 AutoFree

mORMot 1.18 第9章 AutoFree

如果你忘記釋放一個 TSQLQuery對象會發生什麼?會丟失一小部分內存。

如果這種情況在服務器上反覆發生,你最終會耗盡內存,導致服務停止。

有一個極好的選項可以保證你通過創建一個 AutoFree變量來自動釋放內存。在Delphi中(不是在FreePascal中),你可以使用這種簡單的表示法。

替換

ababy := TSQLBaby.Create
\\ 替換爲
TSQLBaby.AutoFree( ababy );

當變量超出範圍時,它將自動被釋放。

function NewMaleBaby(Client: TSQLRest; const Name, Address: RawUTF8): TID;
var
  Baby: TSQLBaby; // 存儲一個記錄
begin
  TSQLBaby.AutoFree(Baby); // 不需要try..finally!
  Baby.Name := Name;
  Baby.Address := Address;
  Baby.BirthDate := Date;
  Baby.Sex := sMale;
  result := Client.Add(Baby, true);
end; // 本地的Baby實例將在此處被釋放

同樣地,你可以自動釋放查詢:

替換

Ababy := TSQLBaby.CreateAndFillPrepare(db, 'name like ?', ['A*']);
替換爲
TAutoFree.Create(Ababy, TSQLBaby.CreateAndFillPrepare(db, 'name like ?', ['A*']));

所以一個查詢可以簡單到如下:

var
  aMale: TSQLBaby;
...
  TAutoFree.Create(aMale, TSQLBaby.CreateAndFillPrepare(Client, 'Name LIKE ? AND Sex = ?', ['A%', ord(sMale)]));
  while aMale.FillOne do
    DoSomethingWith(aMale);

這裏不需要try/finally塊。

如果你希望代碼同時兼容Delphi和FPC,你可以使用稍微複雜一點的 IAutoFree

var
  aMale: TSQLBaby;
...
  auto: IAutoFree;
...
  auto := TAutoFree.Create(aMale,
  TSQLBaby.CreateAndFillPrepare(Client, 'Name LIKE ? AND Sex = ?', ['A%', ord(sMale)]));
  while aMale.FillOne do
    DoSomethingWith(aMale);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章