我正在开发一个包含 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,这一切都取决于Processes:
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
。到目前为止,一切都很好。我的问题
连接到空闲实例我无法以任何方式使用数据库,并且
startup
也不起作用。我重新安装了数据库,将其设置为 1000,重新启动,然后就成功了。重新安装并重新启动而不更改设置也可以。重新安装它,将其设置为10000,然后重新启动,但是不起作用。这让我相信这些值可以设置多高是有限制的,超过限制将导致数据库无法正常启动。所以我的问题是:我可以为 Oracle Database 11g Express Edition 设置的最大进程/会话/事务限制是多少?是否有任何因素会影响我可以控制/更改的限制?或者我是否严重误解了这一切并且解决方案完全不同?我运行此程序的机器是运行 Windows 10 的相当强大的机器,因此电源不应该成为问题。除非软件强制执行人为限制,而且我确实在搜索中找到了这样的评论。
提前致谢。
来自 Oracle
词汇表, 会议是:
数据库实例内存中的逻辑实体,代表 当前用户登录数据库的状态。单个连接可以 已在其上建立 0、1 或更多会话。如果共享服务器被忽略,您很可能会在达到 SESSIONS 参数的限制之前就达到 PROCESSES 参数的限制。
作为最佳实践,逐步增加进程(例如 +200 左右),因为如果将其增加到太高的值(就像您所做的那样),您将无法启动 Oracle 实例。一旦你无法再增加,那就是你的极限了。