本人在线程内创建adoconnection和adoquery。然后用这两个控件往sql数据库插入20000条20列的记录,插入后结束线程,在结束线程钱也释放了自己动态创建的两个控件。问题在于当我插入20000条20列的记录后,数据库就会占用300M的内存,而且不会释放掉,除非我把数据库关闭在重新打开。当然通过测试我发现,虽然数据库占用了300M的内存,但是在以后的若干天内它却不会有明显的增加内存的占用(每天程序都要做50次插入20000条20列记录的工作)。我想解决的问题是可否在每次插完这20000条20列的记录后,它多占用的内存会自动释放掉。当然在插入过程中内存的占用达到300M这是我可以忍受的,但是我希望在每次插完后能回复到没插入之前的接近占用内存状态(即相当于把数据库关闭再重新开启后所占的内存容量)。这个问题我检索了一下,好像所有做类似操作的人都碰到这个问题。所以我估计不是自己程序的问题,而是sql数据库本身的特点。大家给点你们的解决方法吧。
解决方案 »
- Delphi7 打印求助!
- 拖动窗体大小时,控件怎么自适应?
- 请问这是怎么回事呀?简单的跟1一样,在线送粉
- 用delphi做客户端的程序员能拿多少呢?
- 各位每天写多少行代码?
- sql语句在VB里运行出错,关于引号的用法,怎么写
- 急问:我想制作一个在线帮助,请问如何实现?
- 各位再帮帮忙吧,毕业设计的最后一点问题,关于ADO控件的CONNECTION!!!!!!!!!!!!!!!!!
- 在多层中什么对多个表进行更新?
- 请版主把tom_fine(小李),他封杀好了
- cxgrid里如何通过代码,根据不同条件,控制同一列的不同行的可编辑属性,也就是Editing,Readonly属性
- 动态调用dll的一个小问题!!!
所以我需要一个办法:它能在程序操作完数据库之后,让数据库占用内存的情况和刚打开数据库的时候差不多。你能给我一个办法吗?
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;
其实就是修改:ip(机子).属性.内存.动态配置sql server 内存.最大值
例如我的那台机子:内存512m,数据库是20g,我给它定了最大值是200m,从此相安无事,呵呵。