【发布时间】:2012-03-25 16:29:48
【问题描述】:
当连接数限制为 1,100(使用 C3P0)时,我们遇到了创建过多 Oracle 进程(超过 2,000 个)的问题
两个问题:
Oracle 进程和 JDBC 连接之间有什么关系?是否为每个会话创建一个 Oracle 进程?是否为每个 JDBC 语句创建一个?一点关系都没有?
您是否遇到过这种情况,您创建的进程多于 JDBC 连接?
任何评论都将不胜感激。
【问题讨论】:
当连接数限制为 1,100(使用 C3P0)时,我们遇到了创建过多 Oracle 进程(超过 2,000 个)的问题
两个问题:
Oracle 进程和 JDBC 连接之间有什么关系?是否为每个会话创建一个 Oracle 进程?是否为每个 JDBC 语句创建一个?一点关系都没有?
您是否遇到过这种情况,您创建的进程多于 JDBC 连接?
任何评论都将不胜感激。
【问题讨论】:
也许您想检查您的服务器是在专用模式还是共享模式下运行(如果您想减少活动进程的数量,您可能希望将其切换到共享模式)。
你可以通过这样做来检查
select server from v$session
有关流程架构的更多信息
http://docs.oracle.com/cd/B19306_01/server.102/b14220/process.htm
共享/专用服务器模式
http://docs.oracle.com/cd/B10501_01/server.920/a96521/manproc.htm
【讨论】:
每个连接有一个会话。这听起来像您有连接泄漏,您正在打开一个新连接并且没有正确关闭。一种可能性是您在try 块内打开、使用和关闭连接,并且正在处理catch 中的异常,或者由于其他原因提前返回。如果是这样,您需要确保在finally 中完成连接关闭,否则它可能不会发生,从而使连接(以及会话)挂起。在同一个作用域中打开两个连接而不在两者之间显式关闭也可以这样做。
我不熟悉 C3PO,所以不知道如何处理连接,也不知道您的 1100 限制在哪里以及如何施加;如果它(或您)有一个连接池并且您所指的 1100 是最大池大小,那么这听起来不像是问题,因为您会在会话上限之前达到池上限。
您可以查看v$session 以确认所有会话都来自 JDBC,并且没有其他连接。
【讨论】: