mORMot 1.18 第09章 AutoFree

来源:https://www.cnblogs.com/hieroly/p/18163410
-Advertisement-
Play Games

前言 只有自己封裝庫的時候,才知道造輪子有多累。之前使用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);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Objects的創建 依據已有的class CPoint ,我們可以產生一個或多個object(對象),或者說是產生一個instance(實體): CPoint aPoint(7.2); // aPoint._x 初始值為 7.2 aPoint.x(5.3); // aPoint._x 現值為 ...
  • 操作系統 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 進行FreeSWITCH會議室相關功能開發過程中,會遇到需要解析會議室列表信息併進行特定操作的情況,比如設置特定通道變數、發送dtmf、錄音等。今天整理下CentOS7環境下,使用Py ...
  • Spirng 當中 Bean的作用域 @目錄Spirng 當中 Bean的作用域每博一文案1. Spring6 當中的 Bean的作用域1.2 singleton 預設1.3 prototype1.4 Spring 中的 bean 標簽當中scope= 屬性其他的值說明1.5 自定義作用域,一個線程 ...
  • title: 深入理解Python多進程:從基礎到實戰 date: 2024/4/29 20:49:41 updated: 2024/4/29 20:49:41 categories: 後端開發 tags: 併發編程 多進程管理 錯誤處理 資源調度 性能優化 非同步編程 Python併發庫 引言 在P ...
  • 本文主要是想給希望開始寫開源項目的同學們一些開源項目維護的實操建議,也算是給自己梳理一下做一個開源項目需要註意的事項。 ...
  • C++ 多態 多態(Polymorphism)是面向對象編程(OOP)的核心概念之一,它允許對象在相同操作下表現出不同的行為。在 C++ 中,多態通常通過繼承和虛函數來實現。 理解多態 想象一個場景,你有一個動物園,裡面有各種動物,如貓、狗、鳥等。每個動物都有自己的叫聲。使用面向對象編程,我們可以創 ...
  • 最近在翻《c++函數式編程》的時候看到有一小節在說c++14新增了“菱形運算符”。我尋思c++里好像沒什麼運算符叫這名字啊,而且c++14新增的功能很少,我也不記得有添加這種語法特性。一瞬間我有些懷疑我的記憶了,所以為了查漏補缺,我寫了這篇文章。 什麼是菱形運算符 這個概念在Java里比較多見: L ...
  • 前言 在實際開發過程中,如果後端需要啟用https訪問,通常項目啟動後配置nginx代理再配置https,前端調用時高版本的chrome還會因為證書未信任導致調用失敗,通過摸索整理一套開發調試下的https方案,特此分享 後端配置 生成HTTPS密鑰 keytool -genkeypair -ali ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...