.NET Oracle 管理的数据访问连接池不工作或速度慢

.NET Oracle managed data access connection pooling not working or slow

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

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

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

像这样创建连接时,连接状态总是Closed(如果连接池化,它不应该打开吗?)。

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

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

除了我们使用的是 Oracle Connection pooling is slower than keeping one connection open

,问题与本期几乎相同

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

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

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