全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2155
推到 Plurk!
推到 Facebook!

Delphi XE 使用 DataSnap 當WEB Server,為何記憶體一直會累加上去,如何清掉記憶

答題得分者是:GrandRURU
pkz0718
一般會員


發表:4
回覆:7
積分:2
註冊:2013-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-11-27 16:25:16 IP:220.130.xxx.xxx 訂閱
 以下是小弟的程式碼,麻煩各位大大指導,謝謝

var
dbx4Conn: TDBXConnection;

function TWebModule1.GetQueryS(const scmd: string): TJSONArray;
var
date_temp_s: TDBXReader;
i: integer;
arr: TJSONArray;
begin
arr := TJSONArray.Create;
if (Assigned(dbx4Conn)) then
begin
cmd := dbx4Conn.CreateCommand;
end else begin
dbx4Conn := TDBXConnectionFactory.GetConnectionFactory.GetConnection
(db_conn, id_conn, pw_conn);
if (Assigned(dbx4Conn)) then
cmd := dbx4Conn.CreateCommand;
end;
try
cmd.Text := scmd;
date_temp_s := cmd.ExecuteQuery;
while date_temp_s.Next do
begin
for i := 0 to date_temp_s.ColumnCount - 1 do
begin
if not date_temp_s.Value[i].IsNull then begin
arr.Add(UnicodeString(date_temp_s.Value[i].AsString));
end else begin
arr.Add('');
end;
end;
end;
FreeAndNil(date_temp_s);
except
raise;
end;
date_temp_s.Free;
FreeAndNil(dbx4Conn);
Result := arr;
end;

已經做了 FreeAndNil(dbx4Conn);,還是無法清除記憶體
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-11-27 16:37:49 IP:59.120.xxx.xxx 訂閱

[code delphi]
function TWebModule1.GetQueryS(const scmd: string): TJSONArray;
var
date_temp_s: TDBXReader;
i: integer;
begin
Result := TJSONArray.Create;
try
if (Assigned(dbx4Conn)) then
begin
cmd := dbx4Conn.CreateCommand;
end else begin
dbx4Conn := TDBXConnectionFactory.GetConnectionFactory.GetConnection
(db_conn, id_conn, pw_conn);
if (Assigned(dbx4Conn)) then
cmd := dbx4Conn.CreateCommand;
end;

try
cmd.Text := scmd;
date_temp_s := cmd.ExecuteQuery;

while date_temp_s.Next do
begin
for i := 0 to date_temp_s.ColumnCount - 1 do
begin
if not date_temp_s.Value[i].IsNull then begin
Result.Add(UnicodeString(date_temp_s.Value[i].AsString));
end else begin
Result.Add('');
end;
end;
end;
except
raise;
end;
finally
FreeAndNil(date_temp_s);
FreeAndNil(dbx4Conn);
end;
end;

[/code]

pkz0718
一般會員


發表:4
回覆:7
積分:2
註冊:2013-08-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-11-28 11:05:18 IP:220.130.xxx.xxx 訂閱
 感謝大大的指導。因為小弟第一次做web server所以近期過到server的記憶體一直累加上去。那目前已經將程式換成大大所指導的方式。未來如有其他問題。再麻煩請大大指導,謝謝
===================引 用 GrandRURU 文 章===================

[code delphi]
function TWebModule1.GetQueryS(const scmd: string): TJSONArray;
var
date_temp_s: TDBXReader;
i: integer;
begin
Result := TJSONArray.Create;
try
if (Assigned(dbx4Conn)) then
begin
cmd := dbx4Conn.CreateCommand;
end else begin
dbx4Conn := TDBXConnectionFactory.GetConnectionFactory.GetConnection
(db_conn, id_conn, pw_conn);
if (Assigned(dbx4Conn)) then
cmd := dbx4Conn.CreateCommand;
end;

try
cmd.Text := scmd;
date_temp_s := cmd.ExecuteQuery;

while date_temp_s.Next do
begin
for i := 0 to date_temp_s.ColumnCount - 1 do
begin
if not date_temp_s.Value[i].IsNull then begin
Result.Add(UnicodeString(date_temp_s.Value[i].AsString));
end else begin
Result.Add('');
end;
end;
end;
except
raise;
end;
finally
FreeAndNil(date_temp_s);
FreeAndNil(dbx4Conn);
end;
end;

[/code]

GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-01-13 10:15:21 IP:59.120.xxx.xxx 訂閱
不好意思,再補充一下。
有關上述的程式,實際應用應該是由最後操作的函式做清理的工作。

所以程式碼應該還要補充:

jsQueryS := GetQueryS(ASomethingCMD);
try
...
finally
FreeAndNil(jsQueryS);
end;

以上
系統時間:2017-10-19 13:26:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!