我正在研究包含OCI的Oracle驱动程序。为了对其进行测试(主要是稳定性和修复内存泄漏),我正在使用Oracle Database 11g Express Edition(我不是Oracle专家,所以我不知道这是否是正确的版本)。为此,它需要一次提交大量事务:同时进行数十个连接,每个连接维护一个会话池,其中数十个会话同时创建表,插入大量数据并删除表。
无论如何,我很快就遇到了以下错误:
ORA-12516:TNS:listener找不到匹配的可用处理程序 协议栈
事实证明,这是因为进程/会话/交易限制不够高。在互联网上搜索时,有人告诉我可以这样设置:
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文档所说的不同,似乎可以更改流程,将会话设置为比here的processes * 1.5 + 22
规则多2个,并且事务似乎是无限的。该更改是有效的,我现在可以进行更多的连接和会话,而不会遇到错误ORA-12516
。到目前为止,一切都很好。
我想要更多的连接,所以我尝试将其设置为10000。但是,当我这样做时,数据库甚至无法正常启动。当我尝试使用sqlplus连接到它时,出现以下消息:
已连接到空闲实例
我无法以任何方式使用数据库,startup
也将无法使用。我重新安装了数据库,将其设置为1000,重新启动后就可以了。在不更改设置的情况下重新安装和重新引导也可以。重新安装它,将其设置为10000,然后重新启动,但是不起作用。这使我相信可以设置这些值的上限是有限制的,超过该限制将使数据库无法正常启动。
所以我的问题是:我可以为Oracle Database 11g Express Edition设置的最大进程/会话/事务限制是多少?是否有任何因素影响我可以控制/更改的限制?还是我对所有这些都产生了严重的误解,而解决方案却完全不同?我在其上运行的计算机是运行Windows 10的功能相当强大的计算机,因此电源不应该成为问题。除非软件强制实施人为限制,但我确实在搜索中找到了此类注释。
谢谢。