2016-01-22 87 views
5

我们正在使用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)的应用程序中都有此行为。

按照Oracle Documentation

连接池服务关闭连接时不使用它们;连接每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连接被创建时,您将看到此行为。

+0

在我的理解中,连接池是在客户端(=驱动器)完成的,它是在连接上强制执行这种“硬重置”,所以理论上你总是会得到“最小池大小”的统计值,有时候它们会因为某种原因被重置。另一位司机根本就没有这样做。当我们谈论Oracle时,我个人怀疑你可以改变这种行为。如果这会影响您的性能,请使用其他驱动程序。但我希望有人更有经验这种方式:) – Koshinae

+0

我不能再现这一点。我启用了ODP.NET计数器,并使用您的连接字符串,我打开5个连接,对它们做一些处理并关闭并全部处理它们,然后监视HardDisconnectsPerSecond ODP.NET计数器。即使10分钟,我也看不到硬连线。你做的事和我做的不一样吗? –

+0

在OP中查看我的更新。我相信,当连接返回到池时,连接池清理会启动,因此您必须继续工作。 –

回答

0

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

我实际上设置了min pool size = 0。这可以确保应用程序闲置时池为空。我几乎可以保证,除非您的网络非常慢或者已经有一个已经重载的Oracle实例,否则您将不会注意到其中的差异。连接池很重要,但连接通常可以在几毫秒内建立。

扔我在这里下车的唯一的事情是,所有5个连接被关闭 - DECR池大小默认为1

+0

查看我的更新和示例应用程序。我使用MIN POOL SIZE = 0和CONNNECTION LIFETIME = 86400(= 24 Hours)运行示例应用程序,即使使用这些设置并每3秒运行一次SQL,连接池也会每隔3分钟关闭一次连接。 从我所看到的ODP NET不尊重DECR POOL SIZE和CONNECTION LIFETIME设置,只允许连接在活动执行清理时才处于活动状态 –