我现在设了一个定时器,代码是这么写的:
procedure TForm1.Timer2Timer(Sender: TObject);
......
try
adoqry3.ConnectionString:=connstr; adoqry3.SQL.Add('select * from tJobDef') ; adoqry3.Active:=true; except
on e:exception do
begin if ServSock.Active then
begin
ServSock.OnAccept := NIL;
ServSock.OnGetThread := NIL;
ServSock.OnGetSocket := NIL;
ServSock.ThreadCacheSize := 0;
ServSock.Close;
memo1.Lines.Add('down.');
StartBut.Enabled := true;
StopBut.Enabled := false;
end;
//adoqry1.Active:=false;
MessageDlg('连接数据库失败,服务终止,请检查数据库服务!' ,mtError,[mbOK],0);
close;
end
end;
adoqry3.Active:=false;确实也有效果,但是发现随着时间的推移,非常消耗内存,该进程占用的内存越来越大,但一旦将该定时器的Enabled置为false,就没有这个问题了,请问大家有什么好的办法来解决我这个问题?
procedure TForm1.Timer2Timer(Sender: TObject);
......
try
adoqry3.ConnectionString:=connstr; adoqry3.SQL.Add('select * from tJobDef') ; adoqry3.Active:=true; except
on e:exception do
begin if ServSock.Active then
begin
ServSock.OnAccept := NIL;
ServSock.OnGetThread := NIL;
ServSock.OnGetSocket := NIL;
ServSock.ThreadCacheSize := 0;
ServSock.Close;
memo1.Lines.Add('down.');
StartBut.Enabled := true;
StopBut.Enabled := false;
end;
//adoqry1.Active:=false;
MessageDlg('连接数据库失败,服务终止,请检查数据库服务!' ,mtError,[mbOK],0);
close;
end
end;
adoqry3.Active:=false;确实也有效果,但是发现随着时间的推移,非常消耗内存,该进程占用的内存越来越大,但一旦将该定时器的Enabled置为false,就没有这个问题了,请问大家有什么好的办法来解决我这个问题?
用timer是非常消耗资源的
你可以做成服务来完成
if Not adoQry3.Active then
begin
adoqry3.ConnectionString:=connstr;
adoqry3.SQL.Add('select * from tJobDef') ;
adoqry3.Active:=true;
end
else
adoQry3.Requery;
except
on e:exception do
...
试试
try
if Not adoQry3.Active then
begin
adoqry3.SQL.Text := 'select * from tJobDef';
adoqry3.Active:=true;
end
else
adoQry3.Requery;
except
on e:exception do
...
end;
else
adoQry3.Requery;
这段去掉呢,是不是可以完全解决这个问题?
else
adoQry3.Requery;
这段去掉呢,否则检查不出来数据库是否能连接上
else 没连接
if AdoQuery.Connection.connected then 连接
else 没连接
如:将客户端机器网线拔出后再插上,此时,客户端的ADOCONNECTION组件的CONNECTED属性仍为TRUE,
但实际上,客户端与数据库服务器的连接已中断,再执行数据库操作时,会报错的.这时又如何处理.
如果不用定时,在执行一次数据库操作时,如果知道与数据库的连接是良好的呢?
借宝地一用.^_^.
1、不用定时器,在每次执行数据库访问前,判断与数据库的连接是否良好,
但这样可能会使系统进行很多无谓的数据库访问操作。而且应用程序的执行效率
就受到了影响,当然对用户而言,他是感觉不到的;
确定数据库连接良好可用ADOCONNECTION.gettablename();函数来测试;
如下所示:(伪码)
alist:=tstringlist.create;
try
adoconnection.gettablename(alist);//---connection is ok
except
//--connection is failure
adoconnection.connected:=false;
adoconnection.connected:=true;//---connection to db again; end;2、利用定时器:
当数据库操作错误时(假定为连接失效造成的),此时将AODCONNECTION.connected:=false;
用定时器,用一定时间间隔来查看其状态,发现不能时,可以进行再次连接(别忘了加上这一句:
application.processmessage;);
在应用程序中,所有要执行数据库操作的地方都加上:
if adoconnection.connected then
begin
......
end;我用的后者,不知道哪位大侠有没有更好的办法;