2013-04-12 42 views
5

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

我用我的.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个连接。

我所看到的是连接正在增长,一次增长到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(); 
     } 
    } 
} 
+0

你可以发表你如何执行你的命令的例子吗?很高兴看到您使用的是“USING”还是手动创建/处理您的连接/命令 –

+0

请参阅代码示例原始文章的更新...如您所见,我已在使用语句代码而不是手动关闭处理连接 – jprincipe

+0

My Oracle.DataAccess程序集是4.112.3.0,是否您的程序集版本为2.111.6.20?如果是这样,也许是时候更新了。除非你被限制在.NET 4以前版本,并且不能? –

回答

10

我已经找到了原因,在数据库中看到的最大连接数不断增加过去允许在连接池设置的数量在连接字符串中。

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

所以,如果我有最大池5和5 工人的尺寸流程然后连接允许总数25如此看来,每个工作进程都有它的一个连接池的自己的实例不共享跨越其他工作流程。

+2

此外,请注意,连接池是每个应用程序域的每个工作进程,因此,最大池大小为5 * 5工作进程* 2个域中的每个= 50个连接。 – RolandoCC

3

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

select username, program from v$process; 

约JDBC有用的书和会话VS连接可以发现here

3

你可以使用此查询来监视您的连接数&状态。使用这个查询,我能够确认连接字符串设置正在工作,下面的解释。

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

Max Pool Size = 5

我看到了相同的用户名作为Web服务器的空模块下的计数波动。我不知道他们为什么出现在这个桶以及网络服务器之下。

最大池大小= 1

Max Pool Size = 1

当我制约了池的大小,我只看到了空模块1个连接,并为网络服务器1个连接,但后来连接弹出在DBMS_SCHEDULER下,这表明其余的retreivals都在等待处理?

我认为这证明最大池大小正在工作,但我不确定。

+0

感谢您提供有关v $进程的信息。不幸的是,这只是给了我在v $ session表中找到的相同数字的细目。我看到现在已经建立了20个连接,但已经达到了25个。v $ process表中的当前故障是来自连接用户的14个连接,其状态为INACTIVE,w3wp.exe模块和osuser网络?服务。该用户还有另外6个与NETWORK?SERVICE的OSUSER处于非活动状态的连接,但是有一个(空)模块。 – jprincipe

+0

您是否从DBMS_SCHEDULER看到任何内容?你能发布你的结果的蒙版版本吗? –

+0

对于有问题的数据库用户,我没有看到与DBMS_SCHEDULER相关的任何内容。所有连接都来自w3wp.exe或(null)。 – jprincipe

2

如果你绝对必须解决这个问题,并且愿意用性能计数器弄脏&,这篇博文可能会有所帮助。至少它可能有助于缩小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