ODP.NET连接池参数

我正在尝试使用ODP.NET版本2.111.6.20为我的.NET应用程序配置连接池。 该数据库是Oracle 11.1。

我在我的.NET 2.0应用程序中使用以下连接字符串:

Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=2; Max Pool Size=5; Connection Timeout=30;"

根据文档,连接池应初始化为2个连接,并根据需要增加最多5个连接。 它永远不会超过5个连接。

我所看到的是,连接每次增长2个,并且增长到10个连接。 我通过查询v $ session表来监视Oracle数据库中的连接,因此我知道连接来自源自我的应用程序的特定应用程序。

如果有人可以帮我确定在这个应用程序内的连接池中可能发生的事情,可能允许超过最大连接数,我会很感激。

样本C#代码

以下是调用数据库的代码示例:

 const string connectionString = "Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=5; Max Pool Size=5; Connection Timeout=30;"; using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); using (OracleCommand command = new OracleCommand("ALTER SESSION SET TIME_ZONE='UTC'", connection)) { command.ExecuteScalar(); } using (OracleTransaction transaction = connection.BeginTransaction()) { const string procSql = @"BEGIN P_SERVICES.UPDATE_VERSION(:id, :version, :installDate); END;"; using (OracleCommand command = new OracleCommand(procSql, connection)) { command.Parameters.Add(new OracleParameter("id", OracleDbType.Varchar2) { Value = id }); command.Parameters.Add(new OracleParameter("version", OracleDbType.Varchar2) { Value = version }); command.Parameters.Add(new OracleParameter("installDate", OracleDbType.TimeStamp) { Value = dateUpdated }); try { command.ExecuteNonQuery(); } catch (OracleException oe) { if (Log.IsErrorEnabled) { Log.ErrorFormat("Update Error: {0}", oe.Message); } throw; } transaction.Commit(); } } } 

我发现数据库中看到的最大连接数超过连接字符串中连接池设置允许的数量的原因。

IIS中的应用程序池配置为“最大工作进程数”设置不同于默认值1.我发现数据库中看到的连接数可以增长到Max Pool Size * Number of Worker Processes

因此,如果我的最大池大小为5和5个工作进程,则允许的连接总数为25.因此,似乎每个工作进程都有自己的连接池实例,而不是在其他工作进程之间共享。

您可以使用此查询来监控连接计数和状态。 使用此查询,我能够确认连接字符串设置是否正常工作,如下所述。

 select COUNT(*) AS Connections ,s.username ,s.status ,s.module ,s.osuser from V$process p join V$session s on s.paddr = p.addr where NOT s.UserName IS NULL group by s.username ,s.status ,s.module ,s.osuser 

我用2页进行了大量数据库检索。 以下是我的不同结果:

最大池大小= 5

最大池大小= 5

我看到空模块下的计数波动与用户名相同。 我不确定为什么他们出现在那个桶和网络服务器之下。

最大池大小= 1

最大池大小= 1

当我限制池大小时,我只看到空模块的1个连接,以及Web服务器的1个连接,但是在DBMS_SCHEDULER下弹出了连接,这表明其余的retreivals是待处理的?

我认为这certificateMax Pool Size正在运行,但我不确定。

根据汤姆凯特的说法:
连接是您和数据库之间的物理电路。
连接可能是许多类型中的一种 – 最流行的开始DEDICATED服务器和SHARED服务器。
可以在与数据库的给定连接上建立零,一个或多个会话
会话将使用进程来执行语句。
有时在CONNECTION-> SESSION-> PROCESS(例如:正常的专用服务器连接)之间存在一对一的关系。
有时从连接到会话有一对多。
然而,进程不必专用于特定的连接或会话,例如,当使用共享服务器(MTS)时,您的SESSION将从进程池中获取进程以执行语句。 当调用结束时,该进程将被释放回进程池。
好跑
select username from v$session where username is not null将显示当前的视图(不是连接)
要查看您可能使用的连接

 select username, program from v$process; 

可以在此处找到有关JDBC和Session VS Connection的有用书籍

如果你必须解决这个问题,并且愿意使用性能计数器,那么这篇博文可能会有所帮助。 至少它可能有助于缩小Oracle报告的连接数与.NET声称拥有的多少个池和非池连接之间的差异。

http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out/

这些计数器似乎特别有用:

 NumberOfActiveConnectionPools NumberOfActiveConnections NumberOfFreeConnections NumberOfInactiveConnectionPools NumberOfNonPooledConnections NumberOfPooledConnections NumberOfReclaimedConnections NumberOfStasisConnections