ODP.NET连接池参数(ODP.NET Connection Pooling Parameters

2019-08-22 13:37发布

我想配置连接池使用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 $会话表监控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();
        }
    }
}

Answer 1:

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

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

所以,如果我有5个5个工作进程 最大池大小 ,然后连接允许的总数是25这样看来,每个工作进程都有它自己的未在其他工作进程共享一个连接池的实例。



Answer 2:

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

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

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

最大池大小= 1

当我制约了池的大小,我只看到了空模块1个连接,并为网络服务器1个连接,但后来连接DBMS_SCHEDULER下弹出,这表明对我来说,retreivals的其余悬而未决?

我认为这证明了最大池大小是工作,但我不能肯定。



Answer 3:

据汤姆凯特:
连接是你和数据库之间的物理电路。
一个连接可能是许多类型中的一种 - 最流行的开始专用服务器和共享服务器。
零,一个或多个会话可在给定的连接到数据库建立
一种方法将通过会话被用来执行语句。
有时是有一个连接 - >会话级之间的一个关系> PROCESS(例如:一个正常的专用服务器连接)。
有时是一个一对多的连接会话。
一种方法所没有的,专用于特定连接或会话但是例如在使用共享服务器(MTS),您的会话将会从进程池,以执行语句抢的过程。 当通话结束,这一过程被释放回过程池。
所以运行
select username from v$session where username is not null将显示当前seesions(未连接)
要查看连接,你可以使用

select username, program from v$process;

有关JDBC和会话VS连接有用的书可以发现这里



Answer 4:

如果你绝对要解决这个问题,并愿意下来和肮脏与性能计数器,这个博客帖子可能会有所帮助。 至少,它可以帮助缩小甲骨文多少个连接报告与多少汇集和非池连接.NET号称有之间的discrepency。

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

这些计数器看起来他们会特别有用:

NumberOfActiveConnectionPools
NumberOfActiveConnections
NumberOfFreeConnections
NumberOfInactiveConnectionPools
NumberOfNonPooledConnections
NumberOfPooledConnections
NumberOfReclaimedConnections
NumberOfStasisConnections


文章来源: ODP.NET Connection Pooling Parameters