数据库程序操作的不稳定,本人用了一些DELPHI的数据库控件,发现在对相关数据库进行频繁操作时,应用程序内存不断增加,请大家指教!(100分)

  • 主题发起人 主题发起人 baddy
  • 开始时间 开始时间
B

baddy

Unregistered / Unconfirmed
GUEST, unregistred user!
本人写了一个程序,7X24小时运行着的。由于整个程序对数据库操作非常频繁,在程序运行中发现应用程序所需求的
内存不断增加,以前用过ADO、BDE更不稳定,运行不了多长时间就会出错或出异常或程序自动退出
我现在是用ZEOS的数据库控件,我在IDE环境下运行程序没有什么操作异常(程序没有什么逻辑问题)
但是应用程序的内存在增加,请大家指教,或是推荐更好的数据控件,使它运行稳定、高效!谢谢!
或者说说是不是本人在哪一方面存在着对数据控件的操作、理解上的致命错误。。。。。。,请多指导!
程序运行中WIN2000下,数据库是ORACLE!用D5或D6编译后程序同样存在着上面所说的问题!
求救!
 
关键不是数据库控件,而是数据显示等感知控件才是关键!
ADO和BDE本身都比较成熟,它们导致内存释放不完全或丢失问题可能性不大。
而程序用了3RD的显示控件就非常容易出这个问题。
 
你的代码不会有什么问题吧,例如开了很多QUERY而不CLOSE掉,或不停大量取数据
 
to onedot:现在程序除了一个状态框在显示着程序处理状态外,根本没有什么数据显示的感知控件,你认为statusbar会吃内存??

to only you:程序里有三个线程,每个线程对相关表进行操作时表的记录只有几十条最多了,而日志表虽然有几十万条记录,但是我只是往里插记录,
没有其它任何操作!
请大家指教!!
谢谢!
 
[:D]把数据库划为多个小数据库在程序中划为多个子程序分别处理少用全局变量,数据库用过了就清出内存。[:)]
 
应该是你的程序思路有些问题,不是数据库控件的问题!
 
to programsky:能说一下分成几个小数据库的理由吗,另外,程序中几乎没有什么全局变量除了一些系统参数和
,有几个全局变量也是只给一个函数使用的,对于你所说的数据库用过了就清出内存,在代码上怎么处理,另外
程序就是不停得操作数据库中的相关的表的,有这个必要吗???请再次指教!谢谢!

to aizb:谢谢你的提醒,我也是感觉可能是自己的问题,所以你能不能尽可能给我一些提醒或说说你认为我可能
在哪方面出了问题??谢谢!!
 
每次操作是否使用同一个控件,还是使用新创建的控件?如果使用新创建的控件,有可能旧的控件没有删除掉?
 
To Pipi:我是这样做的,一些操作频繁的表,一个表指定一个query,而其它的,有些是共同的,
不知这样有没有问题存在!而且所有的数据操作语法是这样:
with zorasqlquery do
begin
close;
sql.clear;
sql.add('');
open/execsql;
end;
如果是我对这些认识理解上有问题,请大家提醒一下,如果是其它问题,也请大家多多指导!
这个问题很痛苦的啊!我之所以用ZEOS数据控件是在DFW里的一位大哥建议的,关于帖子是:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=542396
换成ZEOS后上面这个帖子上的问题已经没有了,但是现在的问题:程序运行着内存不断增加,
大家努力帮一把吧!^_^ :(
 
这样看看是不是彻底一点:
zorasqlquery不要用共用的,每次动态创建:

zorasqlquery:=Tzorasqlquery.Create(Self);
try
with zorasqlquery do
begin
……Session还是Connection:=......
……其他必要的属性初始化设置
//执行:
sql.add('');
open/execsql;
end;
finally
zorasqlquery.Free; //一定记得释放
end;
 
To Pipi:所有的zorasqlquery是在设计就指定的,是非动态创建的。

不知道你有空看了上次我跟你提到的那个帖子了没有,Fenix在帖子上提到的:

解开后把名字叫zlibmssql.pas的文件引入到你的工程中去,这个pas文件需要ntwdblib.dll这个文件,
如果你的机器上装了mssql客户端,就会自动带,否则从mssql安装盘或其他机器上拷到,几百k.
这个文件提供了mssql的所有客户端函数,odbc就是利用它,bde,ado也是.
把这个文件改一下,在initialization后加上初始化函数的调用,这个函数在改单元已定义了,你只要在这里调用执行它就可以了.
用dblogin创建一个连接通道
用netlname之类的函数把连接信息加到通道上.有port,servername,username,password.
用dbopen尝试连接.
连上后用dbuse选择数据库
dbexec,dbcmd来执行你的sql.
(重要)调用提供的函数释放缓冲内存,每一个sql的执行都会在客户端开辟一个buf来保存所有返回信息.
最后:(重要)释放连接通道.dbclose.
注意该文件中的函数命名和db,dbtable等文件冲突.
整个不过6,7行,简单高效,稳定性100%,永无异常中断等.
最后还是提醒你,做这类的软件安全性,稳定性极其重要,千万不要用bde,odbc,ado之类,否则是自找苦吃.

中就提到了,缓存的清除问题,但是我一直没有找到相关的操作文档,无从入手,说白了,我的能力太次啊!
有空帮我看看吧!
 
我以前也用DELPHI编了个SERVER程序24X7运行,吃内存,运行10天就到300M,当时实施地点
在另一个城市,每次客户打电话到公司,说你的程序把服务器拖死了,都是我的受难日,
在公司高手地位不保,唉,后来离开公司了,再看看代码,原来是BDE的错误:如果SQL语句
由于某种原因出错,即使你怎么TRY。EXCEPT,它都 是不FREE内存的,呵呵,你可以用不内
存检测工具看看。
 
To iamweng:我想问题的是清楚的,对于7X24的程序在用数据库控件进行了SQL后,每执行一次
会占用一定的系统缓冲内存,而对于一般程序因为这方面的影响不明显所以大家一般没注意到
这个问题的影响!有空可以看一下上面我提到的那个帖子,就提到这个问题。我现在的问题是找
到如何释放缓冲内存的操作方法,我想大家的问题就马上能够解决了!

希望高手吗,帮我一把!
 
to baddy:
根据你说的情况,窗体上只有几个数据库感知控件,
占用的内存不会多。很可能是你的程序逻辑上有问题。
也许问题就出现在你定义的线程中,例如对它的调度,
释放等。是否正确操作了。
 
to pcc_mmzl:线程是也是一个循环,另外我的程序中DELPHI IDE下没有什么任何的异常啊,
这是不是就说明了代码没有问题的,但是内存也是在增加,请你再诊断一下!
 
如果程序正确,过一段时间内存会被Windows清除的,不用担心。
 
to alter:现在的问题是程序运行着内存会不断地增加,除非把程序关了,否则WINDOWS是不会
清除的!请大家支持,我快坚持不住了!
 
把数据处理放到DLL中,需要插数据时调用,完毕后释放DLL,这个方法是否可行?
 
to baddy:你现在是不是把你的机器既当服务器,又当客户端,这样肯定会造成你上面所说
问题,因为Oracle本身就有一个SQL缓冲区,不然它怎么实现高效的DML,DDL语句呢?我建议
你找个客户机尝试一下就知道你的程序是否有问题??Delphi中的数据库控件应该是没有什
么问题的,会不会是你没有释放相应的内容,比如说用线程的时候阿。。。
 
后退
顶部