我现在设了一个定时器,代码是这么写的:
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,就没有这个问题了,请问大家有什么好的办法来解决我这个问题?

解决方案 »

  1.   

    当然
    用timer是非常消耗资源的
    你可以做成服务来完成
      

  2.   

    try
     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
    ...
    试试
      

  3.   

    按照longtusoft(神灯之主)的方法,的确可以解决一些问题但我觉得可以用一个TAdoConnection组件来管理TAdoQuery组件这样,其代码可书写为:
    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;
      

  4.   

    谢谢大家的指点,我试了一下,还是会有内存不断增加,但增加的幅度已经大大减少了,我想是不是能把
    else
       adoQry3.Requery;
    这段去掉呢,是不是可以完全解决这个问题?
      

  5.   

    我刚才试了一下,发现不能把
    else
       adoQry3.Requery;
    这段去掉呢,否则检查不出来数据库是否能连接上
      

  6.   

    感觉adoQry3.Requery;还是消耗内存的,大家还有什么好招?
      

  7.   

    个人想了一下这个问题,我想为什么非要用TTimer随时监控数据库连接情况呢?用触发式的更好呀,需要的时候再检测。
      

  8.   

    你只是要测试数据库是否能连上,因此没必要用adoquery来查询,试试动态创建adoConnection来尝试connect、并且测试完毕再把它释放掉
      

  9.   

    if AdoQuery.Connection.connected then 连接
    else 没连接
      

  10.   

    对!支持
    if AdoQuery.Connection.connected then 连接
    else 没连接
      

  11.   

    如果是开始运行时,数据库连接是良好的,在程序运行过程中,数据库连接被外界原因中断,
    如:将客户端机器网线拔出后再插上,此时,客户端的ADOCONNECTION组件的CONNECTED属性仍为TRUE,
    但实际上,客户端与数据库服务器的连接已中断,再执行数据库操作时,会报错的.这时又如何处理.
    如果不用定时,在执行一次数据库操作时,如果知道与数据库的连接是良好的呢?
    借宝地一用.^_^.
      

  12.   

    解决办法有两种:
      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;我用的后者,不知道哪位大侠有没有更好的办法;