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企服之家,中国第一个企服评测及商务社交产业平台。 |