现在用ado连接dbf数据,由于要不断访问数据,所以建立了很多连接。
用timer切换,但是我每次处理完数据,我都close连接和adoquery。
可是跟踪内存的时候还是会有问题出现,内存的占用在不断上升,最后超出系统资源,我该怎么释放?//

解决方案 »

  1.   

    程序控制不应该无限制增长,你应该使用连接池,队列,任务这些概念,让所有作业排队,这种情况下也不应该使用timer而是线程
      

  2.   

    DataFunc := TDataFunc.create;
      bdDate := DataFunc.GetBdDate(arrayZsBm[0]);
      bdDate := copy(bdDate,1,8);               //本地日期  统一格式
      szDate := DataFunc.GetSzDate('sjshq');
      szDate := copy(szDate,1,8);;                 //深圳日期  取第一条记录
      shDate := DataFunc.GetShDate('show2003');
      shDate := copy(shDate,1,8);
      dataModForm.adoq1.Close;
      dataModForm.adoconn1.Close;
      DataFunc.free;
    我不断在访问数据表,还有不断close
     
    跟踪内存的时候,在连接后内存突然增加了一辈,没timer一次就增加1M左右
    还有神秘地方要释放的怎么用连接池啊,不用timer,怎么做线程,以前都用timer做的
      

  3.   

    有可能是Microsoft.Jet.OLEDB.4.0的问题,
    它每调用一次给clientdataset,就开辟一次内存空间
    但也不知道怎么去释放
      

  4.   

    1.你代码贴的不太多.
    2.你哪要是写TIMER里面的话,第一条使TIMER.ENABLE:= FALSE;最后写TIMER.ENABLE:= TRUE;
      

  5.   

    >>于要不断访问数据,所以建立了很多连接。ADO连接dbf这样的桌面数据库,偶不熟悉,可否考虑用BDE,而不用ado控件呢?或者,从你的业务中经常连接,打开,关闭数据库,从性能效率上来说,有一定的瓶颈何不考虑,换个C/S级别的数据库呢,如FireBird,Mysql,当然也可MS Sqlserver如果数据量不是太大还可以考虑文件型的数据库
      

  6.   

    timer的这个问题我考虑进去了,
    现在我能确定是clientdataset的问题,去数据给它的时候,内存猛增
      

  7.   

    如果你是这两种情况,建议你换数据库:
    1、在一个单机环境中访问数据库,因程序逻辑需要同时建了很多连接;
    2、是客户机/服务器应用,同时有多个用户连接数据库。
    建议使用sql server,sqlanywhere等真正的sql数据库。
      

  8.   

    我是访问dbf数据表,没有办法换数据库
    现在知道是数据库引擎的问题了,但是不用Microsoft.Jet.OLEDB.4.0,
    还有什么别的引擎吗,
    能帮忙把连接串都写下来吗
    下面是我的连接串
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+bdPath+';Extended Properties=dBASE IV;User ID=Admin;Password=';
      

  9.   

    现在我用dll来做,没办法了