我们正在使用从 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 的新连接。