我在做什么
我正在开发一个集成了OCI的Oracle驱动程序。为了测试它(主要是稳定性和修复内存泄漏),我使用了Oracle Database 11 g Express Edition(我不是OracleMaven,所以我不知道这是否是适合这项工作的版本)。为此,它需要一次提交大量事务:许多连接同时进行,每个连接维护一个会话池,其中许多会话同时创建表、插入大量数据和删除表。
无论如何,我很快得到了以下错误这样做:
ORA-12516:TNS:监听程序无法找到具有匹配协议堆栈的可用处理程序
事实证明,这是因为进程/会话/事务限制不够高。在网上搜索时,我被告知可以这样设置它们:
alter system set processes=1000 scope=spfile;
alter system set sessions=1000 scope=spfile;
alter system set transactions=1000 scope=spfile;
显然,事实要比这复杂得多,因为这些值是根据彼此而设置的,并且在每个版本中如何工作似乎是不同的。根据Oracle的文档here,这完全取决于进程:
SESSIONS和TRANSACTIONS参数的默认值是从此参数派生的。
流程不能更改:
可修改否
......而同时它也在谈论当您更改它时会发生什么:
因此,如果更改PROCESSES [...]的值,
所以这不是很有帮助。或者也许我在这里误解了什么。不管怎样,使用上面的alter system
调用,我更改了值,并且更改是成功的。当我进行此调用时
(select 'sessions', current_utilization, limit_value from v$resource_limit where resource_name='sessions')
union
(select 'processes', current_utilization, limit_value from v$resource_limit where resource_name='processes')
union
(select 'transactions', current_utilization, limit_value from v$resource_limit where resource_name='transactions');
我得到如下结果:
'SESSIONS' CURRENT_UTILIZATION LIMIT_VALUE
------------ ------------------- ----------------------------------------
processes 314 1000
sessions 317 1524
transactions 2 UNLIMITED
看起来进程可以改变,不像Oracle的文档所说的那样,会话被设置为比这里描述的processes * 1.5 + 22
规则多2个,事务似乎是无限的。改变是有效的,我现在可以建立更多的连接和会话,而不会遇到错误ORA-12516
。到目前为止,一切都很好。
我的问题
我想要更多的连接,所以我尝试将其设置为10000。但是,当我这样做时,数据库甚至不能正常启动。当我尝试使用sqlplus连接到它时,我得到以下消息:
已连接到空闲示例
我不能以任何方式使用数据库,startup
也不能工作。我重新安装了数据库,设置为1000,重新启动,这是工作。重新安装和重新启动,而不改变设置也工作。重新安装,设置为10000,然后重新启动,但是,这使我相信这些值的设置是有限制的,超过这个限制将导致数据库无法正常启动。
所以我的问题是:我可以为Oracle数据库11 g速成版设置的最大进程/会话/事务限制是多少?是否存在任何我可以控制/更改的影响此类限制的因素?或者,我是否严重误解了所有这一切,而解决方案是完全不同的?我正在运行此程序的计算机是一台运行Windows 10的功能相当强大的计算机,所以电源应该不是问题。除非软件强制执行了人为的限制,我在搜索中确实找到了这样的评论。
先谢谢你。
1条答案
按热度按时间1sbrub3j1#
这是因为你可能已经达到了你的RAM限制或者操作系统的限制。每个创建的会话都将保留一定数量的RAM,并且会话取决于进程。
从Oracle glossary,会话为:
数据库执行行程内存中的逻辑实体,代表目前使用者登入数据库的状态。单一联机可以建立0、1或多个阶段作业。
如果忽略共享服务器,则在达到SESSIONS参数的限制之前,可能会达到PROCESSES参数的限制。
作为一个最佳实践,增量增加进程(比如+200左右),因为如果你把它增加到一个太高的值,就像你以前做的那样,你将无法启动你的Oracle示例。一旦你不能再增加了,那就是你的极限了。