【问题标题】:.NET Oracle managed data access connection pooling not working or slow.NET Oracle 托管数据访问连接池不工作或速度慢
【发布时间】:2016-03-15 19:18:31
【问题描述】:

我最近注意到,当我们的应用程序对 Oracle 数据库执行 SQL 查询时,它总是至少需要 200 毫秒才能执行。不管查询的简单或复杂,最短时间约为 200 毫秒。我们正在使用适用于 Oracle 11g 的 Oracle Managed Data Access 驱动程序。

然后我创建了一个简单的控制台应用程序来测试连接。我注意到,如果我像下面的示例一样创建连接,那么每个 cmd.ExecuteReader 方法需要额外的 200 毫秒(打开连接)?

        using (OracleConnection con = new OracleConnection(connStr))
        {
            con.Open();
            OracleCommand cmd = con.CreateCommand();
            ...
        }

这样创建连接时,连接状态始终为Closed(如果连接被池化,不应该是打开的吗?)。

如果我在程序开始时打开连接,然后将打开的连接传递给方法,cmd.ExecuteReader 大约需要 0-5 毫秒才能返回。我尝试将Pooling=true 添加到连接字符串,但它似乎没有做任何事情(无论如何它应该是默认值)。

这是否意味着连接池不能正常工作?或者是否还有其他原因导致cmd.ExecuteReader 需要额外的 200 毫秒来执行?

问题和本期差不多,只不过我们用的是OracleConnection pooling is slower than keeping one connection open

【问题讨论】:

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


    【解决方案1】:

    你的数据库是远程的还是网络造成的延迟?在这种情况下,连接池有效,但问题是始终存在 TCP 通信往返(甚至没有 TNS 数据包)。不幸的是,每次Open 调用都会发生这种情况。

    托管数据访问实现以不同的方式进行通信,因此开销仅发生在第一次 Open 调用时,然后 Open 方法是免费的。

    【讨论】:

    • 我创建了一个控制台应用程序来测试这两种情况,并在同一台机器上运行它。这应该消除网络延迟的可能性。问题也不在于Open,而是ExecuteReader 方法。
    【解决方案2】:

    经过大量的测试和研究,我终于弄清楚了额外的 200 毫秒的来源:我的虚拟计算机的网络适配器。我正在使用 VMWare Player,并且连接被配置为“NAT”模式。 当我将连接更改为“桥接”模式时,延迟被消除了。

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2023-02-02
      • 2023-02-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多