求救:用adoquery处理sql2000数据库,造成内存在不断减少(200分)

  • 主题发起人 主题发起人 zycjf
  • 开始时间 开始时间
Z

zycjf

Unregistered / Unconfirmed
GUEST, unregistred user!
用adoquery 处理sql2000数据库(每天记录大于10万条),看到内存在不断减少,看看资源
管理器,sqlserver占了400多兆(还在不断上升),停掉sql2000,重新启动,sqlserver占的
内存就下来了,谁知道这是怎么回事吗?
处理过程很简单,有两个表,receive,send,从receive中获取未处理的数据,处理后写到
send 中

with adoquery1 do
begin
active:=false;
sql.clear;
sql.add('select * from receive where bz=0');
active:=true;
while not eof do
begin
...获取recieve的记录并处理
...写到send
edit;
fieldbyname('bz').asinteger:=1;
post;
next;

end;
end;

用bde来处理会不会效率高些?
 
对了,上面的程序我是放在一个 timer中执行的,会不会跟此有关?
如果跟此有关,有什么好办法?
 
为什么要用Timer,
应该和这个有关,你的程序不是每隔一段时间就要触发一次! 做什么用的!
 
你的程序中有没有哪里不断地占用资源(如:Create某个对象),而又一直没有释放?
 
应该跟程序没关吧,我把程序都停掉后,内存下不来,一定要把 sqlserver重启才行,而且
数据库空间增长的飞快,主要是日志在增长,如何删除日志?是的,我的程序每隔一段时间
就要触发一次,看看有没有新的数据进来。
 
我看你在SQL SERVER中写个触发器比较好
 
同意caidaoli意见。
 
用存储过程或触发器吧,你这样使用问题很大:
1 与服务器大量的交互数据,而数据的释放要在1分钟以后(连接池是1分钟)
2 你的操作需要大量的进行客户端和服务器端的大量的频繁交互,
所以对服务器和网络的资源消耗都是很大的
3 在数据处理过程中,在commit,checkpoint, space needed 时写入硬盘日志,
因此日志文件的大小取决于:update,insert和delete 的频率;
每个transaction 中数据的修改量;
SQL Server系统参数recovery interval 值 ;
log是否存到介质上用于数据库恢复 ;
因此你的日志产生的数量过大就是由于客户端大量的UPDATE产生的,
你把它移植到服务器端并且不使用timer,而是需要时再触发,那样可能就不能有日志问题了
4 你这种方法处理,不仅造成资源的配置不合理,而且程序升级和维护都比较困难,
所以根本的方法是先把它移植到服务器上。
 
问题是我要在delphi中处理数据啊,触发器是触发sqlserver 来处理的吧 ?如何能通知到
delphi来处理呢?
 
兄弟,先请教一个紧急问题,如何把日志删掉而不影响sqlserver,日志增加的太快了,
写存储过程还需时间,谢谢啦
 
设置truncatelogoncheckpoint属性,具体见SQL SERVER的ONLINE帮助。
但是一定要设置回去呀,不要一直不写日志,否则要有一些非法写入你就没有办法诊断了
 
建议:1.循环结束之后,关闭adoquery。比如adoquery.close;
2.使用存储过程或者触发器吧。数据处理也可以在这里面执行的,功能和在delphi
种执行是一样的
 
多人接受答案了。
 
后退
顶部