干翻全岛蛙蛙 发表于 2024-5-18 18:26:20

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);
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: mORMot 1.18 第09章 AutoFree