我们正在使用Oracle的最新官方ODP.NET托管(发布:2015-10-14 |版本:12.1.2400)到Oracle 12数据库(非RAC)配置,并且我们无法保持数据库连接的活动时间超过3分钟通常为<。ODP.NET托管连接池每隔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;
当我们在服务器上使用性能监视器,看计数器HardConnects/HardDisconnects我们本身连接池关闭并且每3分钟重新打开5个连接,这不是我们所期望的。
我们在使用EF6 for DataAccess的Web应用程序和没有ORM(只是普通的旧SQL)的应用程序中都有此行为。
连接池服务关闭连接时不使用它们;连接每3分钟关闭一次。 ConnectionString属性的Decr Pool Size属性为每3分钟可关闭的最大连接数提供连接池服务。
对我来说 - 只要连接在寿命限制内,连接池中的连接的MIN POOL SIZE的长度应该大于3分钟。
我们有另一个使用Devart的Oracle驱动程序的应用程序,这个驱动程序收集了长时间保持活动状态的连接。
有没有其他人选择了ODP.NET托管驱动程序中ConnectionPool的这种“不当行为”并找到了解决方案? 或者这可能是ODP.NET托管的ConnectionPool中的错误?
UPDATE 2016年1月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 +您必须添加USER ID,PASSWORD和数据源。
每隔3分钟您会看到5个现有连接关闭,并创建5个新连接(MIN POOL SIZE设置)。
运行该SQL看到实际的连接:其中程序LIKE '%OraWinApp%' 为了通过LOGON_TIME递减
当程序 选择SID,LOGON_TIME,prev_exec_start,wait_time_micro/1000 从V $会议 并且perfmon正在运行,当旧连接关闭并且新的login_time连接被创建时,您将看到此行为。
在我的理解中,连接池是在客户端(=驱动器)完成的,它是在连接上强制执行这种“硬重置”,所以理论上你总是会得到“最小池大小”的统计值,有时候它们会因为某种原因被重置。另一位司机根本就没有这样做。当我们谈论Oracle时,我个人怀疑你可以改变这种行为。如果这会影响您的性能,请使用其他驱动程序。但我希望有人更有经验这种方式:) – Koshinae
我不能再现这一点。我启用了ODP.NET计数器,并使用您的连接字符串,我打开5个连接,对它们做一些处理并关闭并全部处理它们,然后监视HardDisconnectsPerSecond ODP.NET计数器。即使10分钟,我也看不到硬连线。你做的事和我做的不一样吗? –
在OP中查看我的更新。我相信,当连接返回到池时,连接池清理会启动,因此您必须继续工作。 –