ADO 内存泄漏

abc3000 2008-07-25 10:34:15
需要做一个程序,7×24运行的。主要功能就是检查数据库中的某几个表,如果有新的数据进来,则把新数据整理后,插入其他表中。然后把这个新数据的某个字段付值,这样下次就不会再处理这条数据了。

为了有足够的表面按钮响应功能,把这个数据库的功能做在线程中了。

但是发现程序运行后内存会越来越多,而且一直不会释放,测试的时候一条新数据都没有,但是内存还是越来越高。

数据库是sql2000或msde

各位有什么建议?
...全文
209 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 unsigned 的回复:]
Configuring Linked Servers
[/Quote]

thx
去看看
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 unsigned 的回复:]
引用 14 楼 abc3000 的回复:
这个程序运行在服务器端(有自己的数据库),他会去检查每个客户端(也有自己的数据库,最多10几个吧),然后检查客户端中指定的某些表是否有新记录,然后插入服务器端数据库,然后整理服务器数据等等。
sql好像没有连其他数据库的命令吧? 所以只能用程序做啦。
首先,这个逻辑本身就是错识的,如果客户端当中发生了变化,应该是它把变化的信息推到服务端,而不是服务端再去他指定的数据库进行检查…
[/Quote]


客户端和服务器端网络经常连不上
所以只能服务器去找客户端,这样至少在网络有问题的时候,客户在操作客户端程序的时候,就不会有延时或停顿的体验了。
其实本来不需要什么客户端数据库,只要客户端程序直接把数据插入服务器端数据库不就行了。
但是就是因为网络问题啊,一旦网络有问题,每个客户端程序就不能运行了。
所以在每个客户端装个数据库,至少把本地信息和数据先保存下来,不影响正常使用。服务器在哪里一直检查,有更新则把服务器数据库一起更新掉。
僵哥 2008-07-25
  • 打赏
  • 举报
回复
僵哥 2008-07-25
  • 打赏
  • 举报
回复
Link-Server
僵哥 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 abc3000 的回复:]
这个程序运行在服务器端(有自己的数据库),他会去检查每个客户端(也有自己的数据库,最多10几个吧),然后检查客户端中指定的某些表是否有新记录,然后插入服务器端数据库,然后整理服务器数据等等。
sql好像没有连其他数据库的命令吧? 所以只能用程序做啦。[/Quote]
首先,这个逻辑本身就是错识的,如果客户端当中发生了变化,应该是它把变化的信息推到服务端,而不是服务端再去他指定的数据库进行检查.
其次,MSSQLServer支持Linker Server.
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 unsigned 的回复:]
这种应用写一个存储过程不就好了?线程式只需要调用存储过程,然后在存储过程当中不断循环操作.或者写一个数据库的JOB.只是需要注意数据库锁的应用,以防止死锁现象的产生即可.
[/Quote]


这个程序运行在服务器端(有自己的数据库),他会去检查每个客户端(也有自己的数据库,最多10几个吧),然后检查客户端中指定的某些表是否有新记录,然后插入服务器端数据库,然后整理服务器数据等等。
sql好像没有连其他数据库的命令吧? 所以只能用程序做啦。
僵哥 2008-07-25
  • 打赏
  • 举报
回复
另外,可以先在你的线程式的Execute当中前后分别加上"CoInitializeEx(nil, COINIT_MULTITHREADED);"和"CoUninitialize;"
例如:
procedure TActionThread.Execute;
begin
CoInitializeEx(nil, COINIT_MULTITHREADED);
try
while Not Terminated do begin
//DoSomething
end;
finally
CoUninitialize;
end;
end;
僵哥 2008-07-25
  • 打赏
  • 举报
回复
这种应用写一个存储过程不就好了?线程式只需要调用存储过程,然后在存储过程当中不断循环操作.或者写一个数据库的JOB.只是需要注意数据库锁的应用,以防止死锁现象的产生即可.
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 knife_s 的回复:]
在MSSQL 2000中那几个表使用触发器,根本不用写程序
附:如果没有新数据插入也内存越来越高,考虑是否有内存未释放
[/Quote]


实在找不到未free的东西了
knife_s 2008-07-25
  • 打赏
  • 举报
回复
在MSSQL 2000中那几个表使用触发器,根本不用写程序
附:如果没有新数据插入也内存越来越高,考虑是否有内存未释放
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 simonhehe 的回复:]
这种情况应该用线程池,可以有效控制资源

lz可以找 僵哥,LiangPei2008问一下,他们在这方面很Nb
[/Quote]

顺便说一下
我现在只用了一个线程
而且我做线程唯一的目的就为了程序表面的几个按钮能即时反映。
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 simonhehe 的回复:]
这种情况应该用线程池,可以有效控制资源

lz可以找 僵哥,LiangPei2008问一下,他们在这方面很Nb
[/Quote]

谢谢 我找找试试
阿三 2008-07-25
  • 打赏
  • 举报
回复
考虑用存储过程实现,然后用job定时执行。
或者用触发器来实现(但这个比较费资源)
shuihan20e 2008-07-25
  • 打赏
  • 举报
回复
如果数据量不大的话,没有必要用线程池吧
simonhehe 2008-07-25
  • 打赏
  • 举报
回复
这种情况应该用线程池,可以有效控制资源

lz可以找 僵哥,LiangPei2008问一下,他们在这方面很Nb
abc3000 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 powerp 的回复:]
如果仅仅是数据,可以考虑在后台实现
[/Quote]


怎么个后台法?
abc3000 2008-07-25
  • 打赏
  • 举报
回复
用过2种方式测试

1. 用完就释放,下次需要用时再create.
2. 连接数据库时马上就create 3个adoquery 和3个adocommand,以后所有的操作都用这6个东西完成,不再程序中在另外create ado了。当然,用完还是会close。


效果差不多

powerp 2008-07-25
  • 打赏
  • 举报
回复
如果仅仅是数据,可以考虑在后台实现
阿三 2008-07-25
  • 打赏
  • 举报
回复
这得看你的线程代码了,是不是有没有即时释放的资源呀

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧