5

我们正在使用从 Oracle 到 Oracle 12 数据库(非 RAC)配置的最新官方 ODP.NET 托管(发布时间:2015-10-14 | 版本:12.1.2400),我们无法保持数据库连接正常运行< 3 分钟。

我们的连接字符串指定:

MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1;

我们也尝试过

CONNECTION LIFETIME=90000;MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1;

当我们在服务器上使用 PerfMon 并观察 HardConnects/HardDisconnects 的计数器时,我们发现连接池每 3 分钟关闭并重新打开 5 个连接,这不是我们所期望的。

我们在使用 EF6 进行 DataAccess 的 web 应用和没有 ORM(只是普通的旧 SQL)的应用中都有这种行为。

根据Oracle 文档

连接池服务在不使用时关闭连接;连接每 3 分钟关闭一次。ConnectionString 属性的 Decr Pool Size 属性为每 3 分钟可以关闭的最大连接数提供连接池服务。

对我来说 - 只要连接在生命周期限制内,有效连接的 MIN POOL SIZE 就应该比 ConnectionPool 中的 3 分钟长得多。

我们有另一个使用 Devart 的 Oracle 驱动程序的应用程序,这个驱动程序 har pooled 连接可以长时间保持活动状态。

有没有其他人在 ODP.NET 托管驱动程序中看到过 ConnectionPool 的这种“不当行为”并找到了解决方案?或者这可能是 ODP.NET 托管的 ConnectionPool 中的错误?

更新 2016.01.27:

我在我的 github 帐户上添加了一个演示应用程序来演示该问题:

https://github.com/jonnybee/OraConnTest

这只是一个小的 winforms 应用程序,您可以在其中添加连接字符串并单击按钮启动后台工作程序,该工作程序每 3 秒运行一次“SELECT 'OK' FROM DUAL”。

我的连接字符串包含: POOLING=True;MAX POOL SIZE=10;DECR POOL SIZE=1;CONNECTION LIFETIME=86400;INCR POOL SIZE=1;MIN POOL SIZE=5 + 您必须添加用户 ID、密码和数据源。

每 3 分钟,您将看到 5 个现有连接被关闭并创建 5 个新连接(MIN POOL SIZE 设置)。

运行此 SQL 以查看实际连接:select sid、logon_time、prev_exec_start、wait_time_micro/1000 from v$session where program like '%OraWinApp%' order by logon_time desc

当程序和 perfmon 正在运行时,您将看到这种行为,因为旧连接被关闭并创建了具有新 login_time 的新连接。

4

2 回答 2

1

我同意你对它应该如何工作的评估,但是 ODP.net 中的连接池有点奇怪。这里的关键是只有在“当应用程序关闭连接时”才遵守连接生命周期,其中 decr 池大小似乎有它自己的线程。我不知道他们为什么这样做 - 仅在返回池时进行验证会创建一个场景,您可以在其中将死连接(由防火墙超时终止)从池中拉出。

我实际上设置了最小池大小=0。这可确保应用程序空闲时池为空。我几乎可以保证你不会注意到差异,除非你在一个非常慢的网络上或者已经有一个已经超载的 oracle 实例。连接池很重要,但通常只需几毫秒即可建立连接。

唯一让我失望的是所有 5 个连接都已关闭 - decr 池大小默认为 1。

于 2016-01-26T16:30:42.507 回答
0

在使用 ODP.Net 的连接池时,我们遇到了同样的行为。属于池的数据库连接每 3 分钟关闭和重新打开一次。

原来,其原因一定是 NuGet-Package Oracle.ManagedDataAccess 12.1 版中的错误

将 NuGet-Packages 更新到 12.2 后,这种行为不再可观察到,并且连接池工作得非常好。

于 2018-05-17T06:00:03.527 回答