【问题标题】:ODP.NET Connection Pooling ParametersODP.NET 连接池参数
【发布时间】:2015-11-27 18:41:13
【问题描述】:

我正在尝试使用 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();
        }
    }
}

【问题讨论】:

  • 你能发布一个你如何执行命令的例子吗?看看您是使用“USING”还是手动创建/处理您的连接/命令会很好
  • 查看代码示例对原始帖子的更新...正如您所见,我在代码中使用了语句,而不是手动关闭处理连接
  • 我的 Oracle.DataAccess 程序集是 4.112.3.0,与您的 2.111.6.20 版本相同吗?如果是这样,也许是时候更新了。除非你被限制在 .NET 4 之前的版本,而且不能?

标签: c# .net oracle connection-pooling odp.net


【解决方案1】:

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

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

因此,如果我的 Max Pool Size 为 5 和 5 个 工作进程,则允许的连接总数为 25。所以似乎每个工作进程都有自己的不跨其他工作进程共享的连接池的实例。

【讨论】:

  • 另外,请注意,连接池是每个应用程序域的每个工作进程,因此,最大池大小为 5 * 5 个工作进程 * 2 个域,每个 = 50 个连接。
【解决方案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

我看到与网络服务器具有相同用户名的空模块下的计数波动。我不确定他们为什么会出现在该存储桶以及网络服务器下。

最大池大小=1

当我限制池大小时,我只看到空模块的 1 个连接和 web 服务器的 1 个连接,但随后在 DBMS_SCHEDULER 下弹出连接,这向我表明其余的检索正在等待?

我认为这证明 Max Pool Size 有效,但我不确定。

【讨论】:

  • 感谢您提供有关 v$process 的信息。不幸的是,这只是对我在 v$session 表中确定的相同数字进行了细分。我现在看到总共建立了 20 个连接,但已经看到它达到了 25 个。 v$process 表中的当前细分是来自连接用户的 14 个连接,状态为 INACTIVE,w3wp.exe 的模块和 osuser网络?服务。该用户还有另外 6 个连接与 NETWORK?SERVICE 的 OSUSER 处于不活动状态,但模块为 (null)。
  • 您从 DBMS_SCHEDULER 中看到任何内容吗?您可以发布结果的屏蔽版本吗?
  • 我没有看到任何与相关数据库用户的 DBMS_SCHEDULER 相关的内容。所有连接都来自 w3wp.exe 或 (null)。
  • 您是否有单独的本地和开发环境,并且可能没有 100% 正确复制连接字符串?
  • 我已经在多个环境中进行了测试,包括本地环境和部署到不同 IIS 实例的环境。它们都显示出相同的连接行为,即超过允许的最大连接数。
【解决方案3】:

根据Tom kyte:
连接是您和数据库之间的物理电路。
连接可能是 多种类型中的一种——最流行的开始是专用服务器和共享服务器。
可以通过与数据库的给定连接建立零个、一个或多个会话
会话将使用进程来执行语句。
有时 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 的有用书籍可以在here找到

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      相关资源
      最近更新 更多