本人在线程内创建adoconnection和adoquery。然后用这两个控件往sql数据库插入20000条20列的记录,插入后结束线程,在结束线程钱也释放了自己动态创建的两个控件。问题在于当我插入20000条20列的记录后,数据库就会占用300M的内存,而且不会释放掉,除非我把数据库关闭在重新打开。当然通过测试我发现,虽然数据库占用了300M的内存,但是在以后的若干天内它却不会有明显的增加内存的占用(每天程序都要做50次插入20000条20列记录的工作)。我想解决的问题是可否在每次插完这20000条20列的记录后,它多占用的内存会自动释放掉。当然在插入过程中内存的占用达到300M这是我可以忍受的,但是我希望在每次插完后能回复到没插入之前的接近占用内存状态(即相当于把数据库关闭再重新开启后所占的内存容量)。这个问题我检索了一下,好像所有做类似操作的人都碰到这个问题。所以我估计不是自己程序的问题,而是sql数据库本身的特点。大家给点你们的解决方法吧。

解决方案 »

  1.   

    这是SQL Server的内存管理的问题,SQL Server默认的内存是机器的内存,当有其他程序需要内存时,SQL Server就会把不用的内存释放掉。
      

  2.   

    可是我测试的结果不会啊,只要做一次插入20000条20列的记录的操作后。它就占了300M的内存,这时我若是打开delphi,还有其他程序的话,sql占用的那300M内存不会释放。我的机子内存是512M,可是我的内存使用早就600M以上了。在这种情况下,我把sql关掉再打开,则机子的内存使用下降为400M以下,而不会是600多M。
    所以我需要一个办法:它能在程序操作完数据库之后,让数据库占用内存的情况和刚打开数据库的时候差不多。你能给我一个办法吗?
      

  3.   

    这个问题强烈关注,我也是用TADOQuery,递归生成树型结构,每次ADOQuery1.Open数据库连接的时候都会消耗100多K的内存,且生成树型结构将近要Open数据库链接很多次,也就是每次刷新一次树型结构都要消耗10M的内存,且在递归退出后也不释放内存,运行到后期就出现虚拟内存太少的错误,请教各位这个问题应该如何解决呢??
      

  4.   

    procedure TCreateDoc.SetSickSubTree(var ParentNode:TTreeNode;SickID:integer;ParentID:integer;LevelNO:integer);
    var
      i,SubParentID,SubLevelNO:integer;
      str:string;
      SubNode:TTreeNode;
      ADOq_t:TADOQuery;
    begin
      //建立疾病名称子树
      str:='SELECT ID,DetailDesc FROM SickDetailInfo WHERE ';
      str:=str+' SickID='+IntToStr(SickID)+' AND ParentID='+IntToStr(ParentID)+' AND ';
      str:=str+' LevelNO='+IntToStr(LevelNO);
      ADOq_t:=TADOQuery.Create(nil);
      ADOq_t.Connection:=PublicUnit.ADOCon;
      ADOq_t.SQL.Clear();
      ADOq_t.SQL.Add(str);
      ADOq_t.Open();                                            //打开数据库连接获取数据集
      if (ADOq_t.RecordCount=0) then
        exit;
      ADOq_t.First;
      for i:=0 to ADOq_t.RecordCount-1 do
      begin
        SubNode:=TreeView.Items.AddChild(ParentNode,ADOq_t.Fields[1].Asstring);
        //赋ID的值给节点的Data属性
        SubNode.Data:=Pointer(ADOq_t.Fields[0].AsInteger);
        SubLevelNO:=LevelNO+1;
        SubParentID:=ADOq_t.Fields[0].AsInteger;
        SubNode.ImageIndex:=1;
        SetSickSubTree(SubNode,SickID,SubParentID,SubLevelNO);   //递归调用
        ADOq_t.Next;
      end;
      ADOq_t.Close();                                   //关闭数据库连接
      ADOq_t.Connection := nil;                         //将数据库连接置为nil值
      ADOq_t := nil;                                    //释放ADOQuery占用的内存,经过以上三步,始终无法正确释放程序开始时候占用的内存。
    //  ADOq_t.Destroy();
    //  SubNode.Delete();
    //  SubNode.Free();
    //  ADOq_t.Delete();
    //  ADOq_t.Free();
    end;
      

  5.   

    这个问题其实很早以前就有n人解决了,我也是最近才看到的。
    其实就是修改:ip(机子).属性.内存.动态配置sql server 内存.最大值
    例如我的那台机子:内存512m,数据库是20g,我给它定了最大值是200m,从此相安无事,呵呵。