我正在調試使用ADO進行數據庫連接的應用程序,主要是TAdoConnection和TAdoQuery 經過一些測試後,結果表明TAdoQuery持續消耗並且不釋放內存。 該問題可以很容易地與此代碼被再現:Delphi ADO內存消耗
procedure TForm1.RunQueries;
var
Q: TADOQuery;
Conn: TADOConnection;
begin
Conn := TADOConnection.Create(nil);
Conn.ConnectionString := 'Provider=PGNP.1;Password=*****;User ID=*****;Data Source=*****;Initial Catalog=*****;Extended Properties="PORT=5432"';
Conn.LoginPrompt:=False;
Conn.Connected := true;
Q := TADOQuery.Create(nil);
Q.Connection := Conn;
Q.SQL.Text := 'select * from sometable where extract(year from now()-Field1)::int/60>=15 or Field2>=50 limit 5';
q.Open;
q.Close;
FreeAndNil(Q);
FreeAndNil(Conn);
end;
如果這是一個帶有計時器在一些間隔(例如200毫秒)所消耗的存儲器保持與各種速度(每小時20-50MB)上升運行。 SQL文本本身並不真正相關。它也消耗內存'select * from Table1',只有更慢。帶有'delete ...'語句的ExecSQL似乎不會導致問題。
我用GetProcessMemoryInfo做了一些測試,看起來內存在使用Open方法之後被消耗並且沒有釋放。儘管如此,並非所有執行都會導致相同的內存增加。
這發生在使用PostgreSQL和不同ADO提供程序的開發服務器上,但我無法用MySQL重現它。使用http://www.pgoledb.com的ADO提供程序的其他應用似乎正常工作,所以問題不僅在於提供商 我嘗試了AQTime和FastMM4,但都報告沒有泄漏。 用D6和XE2構建的代碼工作原理相同。
我發現這個問題Delphi: TAdoQuery Memory Leak?,但問題出在代碼中的錯誤。
我的問題類似於這個錯誤報告http://qc.embarcadero.com/wc/qcmain.aspx?d=7018。
您是否認爲這是Delphi中的一個bug,是否有解決方法?
更新: 即使對象是靜態的,實際上也會出現此問題。例如,一個Connection和Query組件放在表單上,並且連接保持打開狀態。只有Query SQL文本被更改並執行。
我試圖從PGfoundry.org安裝一個不同的提供者,但結果對我來說很奇怪。
兩個Postgres提供程序在不同的操作系統上出現內存泄漏,但不在MySQL中。我不確定那是什麼意思。如果這是一個VCL問題,它不應該總是存在嗎?如果不是,考慮到它發生在同一個數據庫服務器的不同提供者上,哪一層導致它?
您是否將系統的MDAC更新爲最新版本?您是否嘗試直接訪問OleDB圖層 - 您可以嘗試[我們的開源單元](http://blog.synopse.info/post/2011/06/27/SynOleDB%3A-OpenSource-Unit-for-direct-接入到任何數據庫,通過-OLEDB)。 –
QC註釋建議嘗試使用服務器端遊標而不是客戶端。你測試過了嗎? – whosrdaddy
我更新了MDAC,並在Server 2008和2003兩個版本上測試,結果很不幸。 遊標對內存消耗也沒有影響。 至於直接訪問,我還沒有嘗試過,因爲我想避免重寫代碼的太多部分,這部分代碼非常大,而且不是我寫的。如果沒有其他選項,我也會嘗試。 – VGeorgiev