ODP.NET连接池参数

时间:2013-04-12 21:16:20

标签: c# .net oracle connection-pooling 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();
        }
    }
}

4 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:4)

您可以使用此查询来监控您的连接数量&状态。使用此查询,我能够确认连接字符串设置是否正常,请在下面解释。

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

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

最大泳池尺寸= 1

Max Pool Size = 1

当我限制池大小时,我只看到空模块的1个连接和Web服务器的1个连接,但是在DBMS_SCHEDULER下弹出了连接,这表明其余的retreivals正在等待?< / p>

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

答案 2 :(得分:3)

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

select username, program from v$process;

可以找到关于JDBC和Session VS Connection的有用书籍here

答案 3 :(得分: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