ToB企服应用市场:ToB评测及商务社交产业平台

标题: mORMot 1.18 第09章 AutoFree [打印本页]

作者: 干翻全岛蛙蛙    时间: 2024-5-18 18:26
标题: mORMot 1.18 第09章 AutoFree
mORMot 1.18 第9章 AutoFree

如果你忘记释放一个 TSQLQuery对象会发生什么?会丢失一小部门内存。
如果这种情况在服务器上反复发生,你最终会耗尽内存,导致服务停止。
有一个极好的选项可以包管你通过创建一个 AutoFree变量来主动释放内存。在Delphi中(不是在FreePascal中),你可以使用这种简单的表示法。
替换
  1. ababy := TSQLBaby.Create
  2. \\ 替换为
  3. TSQLBaby.AutoFree( ababy );
复制代码
当变量超出范围时,它将主动被释放。
  1. function NewMaleBaby(Client: TSQLRest; const Name, Address: RawUTF8): TID;
  2. var
  3.   Baby: TSQLBaby; // 存储一个记录
  4. begin
  5.   TSQLBaby.AutoFree(Baby); // 不需要try..finally!
  6.   Baby.Name := Name;
  7.   Baby.Address := Address;
  8.   Baby.BirthDate := Date;
  9.   Baby.Sex := sMale;
  10.   result := Client.Add(Baby, true);
  11. end; // 本地的Baby实例将在此处被释放
复制代码
同样地,你可以主动释放查询:
替换
  1. Ababy := TSQLBaby.CreateAndFillPrepare(db, 'name like ?', ['A*']);
  2. 替换为
  3. TAutoFree.Create(Ababy, TSQLBaby.CreateAndFillPrepare(db, 'name like ?', ['A*']));
复制代码
所以一个查询可以简单到如下:
  1. var
  2.   aMale: TSQLBaby;
  3. ...
  4.   TAutoFree.Create(aMale, TSQLBaby.CreateAndFillPrepare(Client, 'Name LIKE ? AND Sex = ?', ['A%', ord(sMale)]));
  5.   while aMale.FillOne do
  6.     DoSomethingWith(aMale);
复制代码
这里不必要try/finally块。
如果你盼望代码同时兼容Delphi和FPC,你可以使用稍微复杂一点的 IAutoFree:
  1. var
  2.   aMale: TSQLBaby;
  3. ...
  4.   auto: IAutoFree;
  5. ...
  6.   auto := TAutoFree.Create(aMale,
  7.   TSQLBaby.CreateAndFillPrepare(Client, 'Name LIKE ? AND Sex = ?', ['A%', ord(sMale)]));
  8.   while aMale.FillOne do
  9.     DoSomethingWith(aMale);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4