这里的情景......
我们有正在运行最新版本的ODAC(Oracle客户端)的内部网站。 它打开数据库连接,运行一个存储过程或包装方法中,然后断开连接。 连接池被打开,而且我们目前正在在双方的开发和测试环境的版本11g中,但10gR2中下在我们的生产环境。 这发生在生产。
前几天,一个进程开始发射了一个ORA-2020错误。 这个过程从我们的内部网站中的网页调用。 用户只需设置一个日期,点击一个按钮,一个作业开始另一种系统,是从网站上分开。 调用本身,但是,使用数据库链接运行功能。
我们已经冲刷的SQL发现,它仅使用一个数据库链接。 而且,由于这些链接是在每个会话的基础和用户不超过4默认限制,这怎么可能,我们得到一个ORA-2020错误。
我们已经跑了一系列的测试,试图推倒4. ODAC的缺省限制,从我记得,每次运行连接后提交,而我似乎无法运行4个DB连接,然后运行一块SQL的1个DB直接链接后的任何错误。 我提出这个错误的唯一方法是,如果我运行4个DB链接,那么功能或用一块在其内部数据库链接的动态SQL查询。 因为这个问题是零星的,我们没有这样的问题。 它并不总是发生。
问题
- 有没有可能是连接池是允许用户B使用用户A的连接的初始过程运行之后,因此增加了打开链接数量,如果用户B运行具有更多的数据库链接一个SQL语句?
- 这是一种情况,就要了我们的极限过去4? 什么是增加数量的缺点是什么?
- 我需要从数据库断开连接之前显式关闭打开的数据库链接? Oracle文档似乎表明它应该自动发生,但“偶尔” ......没有。
首先,简单的解决方案:我会仔细检查,在生产数据库的默认链接的数量实际上是4。
select *
from v$system_parameter
where name = 'OPEN_LINKS'
假如你不打算下车即到淡淡道:
有没有可能是连接池是允许用户B使用用户A的连接的初始过程运行之后,因此增加了打开链接数量,如果用户B运行具有更多的数据库链接一个SQL语句?
你说你明确关闭会话,其中,根据该文件 ,应该意味着与该会话相关的所有环节都关闭。 除此之外,我承认在这一点上完全无知。
这是一种情况,就要了我们的极限过去4? 什么是增加数量的缺点是什么?
有没有,我能想到的任何缺点。 汤姆凯特指出 ,虽然很久以前,每个打开的数据库链接使用PGA内存500K。 如果你没有任何那么这显然会导致一个问题,但它应该是比罚款大多数情况下更多。
有,但是,意想不到的后果:这个数字试想一下,你到100的代码有人的东西,不断地打开链接,并通过他们都吸引了大量的数据select * from my_massive_table
或相似。 取而代之的4届这样做,你有100个,其中试图同时传输数百GB。 应变下你的网络模...
有可能更多,但是你得到的图片。
我需要从数据库断开连接之前显式关闭打开的数据库链接? Oracle文档似乎表明它应该自动发生,但“偶尔” ......没有。
如您所知的最好的答案是“可能不会”,这是没有太大的帮助。 你不提正是你如何终止会话,但如果你杀了它,而不是关闭,然后优雅地肯定。
使用数据库链接滋生的远程服务器上的子进程。 因为你的服务器不再是绝对负责这个过程中有事情,可能会导致它成为孤儿或不关闭父进程的终止万千。 绝不会出现这种情况的全部时间,但它可以和确实。
我会做两件事情。
在你的过程中,如果遇到异常,电子邮件以下查询自己的成绩。
select * from v$dblink
作为最低要求至少你会知道什么数据库链接都在开会并给你跟踪他们的一些方法。
按照本细则的建议; 具体有以下几种:
“你可能会遇到这种情况,手动关闭的链接,例如,紧密的联系时:
- 通过链路建立的网络连接是在应用程序中不经常使用的。
- 用户会话必须被终止“。
第一,似乎正好适合你的情况。 除非你的过程是对时间敏感,这似乎不这样的话,那么你有什么又不会损失什么 语法是:
alter session close database link <linkname>
我们最终增加链接量,但我们从来没有找到问题的根源。