ODP.NET连接池参数

jpr*_*ipe 6 .net c# 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

jpr*_*ipe 12

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

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

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

  • 此外,请注意,连接池是每个应用程序域的每个工作进程,因此,最大池大小为5*5工作进程*2域每个= 50个连接. (3认同)