前言 只有自己封裝庫的時候,才知道造輪子有多累。之前使用Python的時候,基本都只需要import,隨便哪個功能都有人寫好輪子用。不過造輪子也有好處,可以瞭解一些比較基礎的知識。 其實aardio也有很多已經造好的輪子可以用,只是因為只有作者在維護,而且沒有一個活躍的社區,所以很多方面有些缺失,比 ...
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);