三层问题!Insufficient memory for this operation alia:aa(200分)

F

fpsky

Unregistered / Unconfirmed
GUEST, unregistred user!
基于DCOM/COM的三层程序,结构:DDELPHI6+BDE+ORACLE
客户端报这个错
“Insufficient memory for this operation alia:aa”
服务器端报
DAX错误
重启服务器后恢复正常,现在连接的客户端一多,几乎每天都得当服务器。
1000分求解决方法,谢谢!
 
database.handleshare:=true;
session.autosessionname:=true;
 
to 张剑波:
已经设了!
 
你是用database控件联的数据库吗?
可能是连上之后没有及时的断开
好象有一个property管这些的吧
好久不用delphi了
本来水平也不高,现丑了:)))))))))))))
关注!!!
 
to zhang12321:
请指教,我的确用的是DATABASE,谢谢!
 
我一直在线等待,我的QQ:2874105
解决之后我发1000分,不成敬意(:
 
这个好像是bde的bug,我曾经在调试的时候也出现过这种问题,你可以规定在每天
x:xx到x:xx禁止连接,然后让机器重启一下,只要5分钟就好了,:)
 
有没有更好的方法,哥们,快呀!!
 
再提一下!
 
我以前作过三层的东东
也是用的database控件
也遇 到过这种情况
可能是BDE的问题,后来我也不知为什么就好了,真是对不起,帮不上忙
关注!!!!!
 
可能是这样的,你查看WIN 的任务管理器内存占用不断在增加,
原因是在BDE形式下:
try fianlly end
try except end
虽然不报错,可是内存的占用不断在增加
优化程序,减少这种情况的发生。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1213259
 
to:张剑波,
看了旧的贴子,受益非浅,但大多不是针对我这个问题,在中间上没有什么多余的代码,
只有10个QUERY,10个DataSetProvider,它们一对一连接,其中每个QUERY都连接到数据
库控件DATABASE,而DATABASE控件通过BDE别名连接ORACLE!!
客户端更新数据和查询数据都是通过CLIENTDATASET。COMMAND:=SQL语句来完成的。
现在的规律是每15小时中间件就会出现
“Insufficient memory for this operation alia:aa”
错误,请再指教!
 
是BDE的问题,在线程中,TDatabase模块不断的生成,断开,一定时间后就会出现这个错误,
类似的还有"已经超出DatabaseCount的极限"----英文我忘了。
一般人写多层,运行时都是远程数据模块都用户连接而生成,用户断开而消忘的,一段时间后就会出现这个问题了。
解决办法是有的,参考$DELPHI$/Demos/Midas/Pooler这个例子,把数据模块换成你那个,把Pooler.pas文件中的关于
接口的定义也换成你那个接口,就行了,这是李维多层应用系统编推荐的例子,我已经确认它是
可以使用的了,我这里是两台应用服务器支撑70多个客户端,很轻松。
另个ShareHandle一定要是False,否则就会出现所有的客户端同连一个数据库会话,效率会很低的。
最后,请注意线程和实例模式的不同,就是这个:ciInternal, tmApartment
 
to:szf
谢谢你的参与,
只是现在这个项目已经运行了,不能再另外做中间层了,只能在现在的基础上改动这个BUG
,有什么好的解决方法没有,谢谢了!!
 
不用改中间层的。
Pooler.pas是个自动化对象的代理类,你只要实现的是原来的接口,客户端程序根本不需要
任何改动。----这个是最好的办法。
另外也可以提供一个方法,是我未懂得使用这个方法的解决办法:
1、做两个全局的TObjcecList,然后
2、每个远程数据生成时,先从全局ObjectList中取TSession和TDatabase
取到后,置位已经使用
取不到时,生成新的TSession和TDatabase,并存入这两个ObjectList
3、远程数据模块退出后置未使用标志
注意:ShareHandle必须为True,否则数据不能支持太多的连接。
 
to:szf
你有没有做过这方面的例子,能发给我一个学习吗?在三层方面我学的很浅。谢了!
我的EMAIL:
fpsky2000@163.net
 
数据库设定的优化:
BDE的设定:
BDE Administrator Config
Configuartin/system/int SharedMemSize=8192
Configuartin/system/int MaxfileHandles,默认为48,如不足,将出现"File handle not enouth"
Configuartin/system/int 如果调整了SharedmemSize,MaxFileHandles的话,就应该调整这个选项同,否则可能是挖东墙补西墙。默认16M。 建议:如果系统真有多余内存,可以调整数据缓冲内存(data cache),这样更有效。除非是调整了上述两个选项。
Configuartin/system/int MaxBufSize,默认2M,必须是128K的倍数。
Configuartin/system/int MinBufSize,默认128K,应该增大一点。
Driver Flags :属于BDE/IDAPI内部使用的设定。对于MS SQL Server或是Sybase来说,设为0。
SqlPassThru Mode:对于SQL Server来说,建议设为Shared NoAutoCommit。(由数据库自己控制事务。本系统大量使用存储过程,很合适。)
SqlQryMode:控制Delphi程序使用的SQL叙述是由谁来解释、执行。对于SQL Server来说,可以设为Server。但如果要Join不同数据库中的表的话,最好设为空。
例:C/S系统,DBServer为WinNT,Client为32M Windows95/98。Client超过50台。
系统要求12M,剩下20M,10-12M给应用程序,有8-10M的额外内存。
SharedMemSize=4M,避免发生内存不足的情形发生。
MaxBufSize=3M。
MaxSize=18M。
一定要调整服务器中的SharedMemSize,否则连结的Client多了会发生“内存不足”。一个连结的Client会使用4M左右的内存。所以一台128M的服务器如果服务25台Client,扣除WinNT本身需要的20M左右的内存,剩下的8M额外的内存,建议首先增加SharedMemSize的大小,最小4M以下。
MS Sql Server设定:
除了必须注意数据缓冲内存的大小之外,另一个重要的因素就是Delphi的Client Application和服务器通讯的效率了。可以设定SQL Server原生驱动程序中TNS Packet Size为4096。
通用数据库调整:
设定数据库服务器最佳化网络应用程序。点击网络,打开“本地连接”,“属性”,“Microsoft网络文件和打印机共享”,然后选择设定“最大网络应用程序使用”。
 
你的中间层一定是作成有状态的了。当客户端执行sql以后服务器端依然为这个客户保留
着状态。 这样连接的客户一多 dbe的session 就超出管理限制内存溢出了。
可以将中间层改为无状态的。
因为你具体的实现我不是很清楚,你可以参考楼上说的 clientdataset.commandtext 的
方式。具体的也可以查询李维的系统篇。
 
顶部