Oracle会话和连接池之间的关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle会话和连接池之间的关系相关的知识,希望对你有一定的参考价值。
让我先解释一下这个设置。
我们有一台运行在2GB RAM机器上的oracle服务器。 Db实例的init参数“sessions”设置为160。
我们在Websphere 6.1上部署了该应用程序。连接池设置为Min 50和Max 150。
当我们在40个用户上运行Load test(并发,使用jMeter)时,一切都很顺利。但是当我们将concurent用户增加到Beyond 60时,Oracle会抛出异常,因为它不在会话中。
我们检查了应用程序是否有任何连接泄漏,但找不到任何连接泄漏。
那么它是否意味着40的并发性是这个设置可以采取的?增加Oracle会话/进程是获得更高并发性的唯一方法吗?
连接池中的数据库会话和连接到底有何关联?根据我的理解,连接不能超过会话,因此将Max Connection池设置为多于会话可能并不重要。那是对的吗 ?
在Google图书上查看这个book。它解释了连接和会话之间的差异。
Metalink提供了有关SESSIONS参数的以下建议:
递归会话是RDBMS正常运行的重要部分。无法识别需要此类会话的每种情况,但一般而言,如果用户启动的操作需要操纵数据字典对象,则可能会创建递归会话。举一个简单的例子,假设您以普通用户身份登录时创建了一个表。在幕后,这必须将行插入到SYS用户拥有的obj $,tab $ etc中。由于普通用户没有权限插入这些对象,因此会创建一个以SYS身份登录的递归会话。
解:
增加SESSIONS参数。
建议是为递归会话保留50%的SESSIONS值。因此,例如,如果预期打开30个客户端会话,则将SESSIONS参数设置为60。
因此,根据websphere和您的用户进程所做的事情,这可以部分解释您所看到的内容。
您的所有连接是否都使用相同的用户帐户?如果是这样,您可能需要检查是否有该用户帐户的每用户会话限制。
此外,您是否获得超过40个连接的许可? (检查您的参数文件中是否设置了LICENSE_MAX_SESSION)
会话池由客户端驱动。它不知道(或控制)数据库允许的会话数。
您应该查看服务器以确定允许的实际连接数,并根据服务器允许的内容设置会话池数。
您的连接池不应使用所有允许的连接。这将允许其他ID连接。如果你有一个使用USER_1的应用程序,你可以设置连接池使用一些允许的连接,但留下足够的连接...哦,比如说DBA要登录。
- 编辑 - 在连接池最大化之前,进程可能已用完。
SQL> show parameter processes
NAME TYPE VALUE
--------------------------------------------------------------------------------
processes integer 40
这是允许的进程总数现在看看已经使用了多少进程 - 其中许多都是后台触发器,你永远不会想到。
SQL> select count(*) from v$process;
我的v $ session包含30个条目,其中4个具有用户名(其中一个是后台作业)。
如果您有后台流程(例如批处理作业),他们可能正在咀嚼会话。
但可能是你的内存不足。对于50个会话的连接池,2GB似乎有点低。假设Oracle 10g,你的RAM分为共享(SGA)和进程(PGA)。假设您有15GB的SGA,所有会话都留下500MB。如果会话每次获得10MB,您将达到约50个会话的限制。
实际上,1。你将在盒子上运行其他“东西”,因此甲骨文将无法获得完整的2GB内容
- 您的SGA可能更小或更大
- 您可能使用11g并让Oracle将PGA和SGA分配到单个池中
- 您可能正在使用PGA_AGGREGATE_TARGET(让Oracle根据会话数量猜测PGA设置)或自己设置内存限制。
- 你可能有一些内存饥渴的过程会咀嚼东西
PS。 2GB是否意味着您使用的是Windows?
以上是关于Oracle会话和连接池之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
如何在python多进程代码中使用cx_Oracle创建一个连接(或会话)池来连接Oracle数据库?
像 Atomikos 这样的 JTA 提供者和像 HikariCP 这样的连接池之间有啥关系?