加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle – ODP.NET托管ConnectionPool每3分钟关闭/打开一次

发布时间:2020-12-12 13:14:12 所属栏目:百科 来源:网络整理
导读:我们正在使用从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; 我们也试过
我们正在使用从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 for DataAccess的webapp和没有ORM的应用程序(只是普通的旧SQL)中都有这种行为.

根据Oracle Documentation:

The connection pooling service closes connections when they are not used; connections are closed every 3 minutes. The Decr Pool Size attribute of the ConnectionString property provides connection pooling service for the maximum number of connections that can be closed every 3 minutes.

对我来说 – 只要连接在生命周期限制内,连接池中的有效连接的MIN POOL SIZE持续时间要长于3分钟.

我们有另一个使用Devart的Oracle驱动程序的应用程序,这个驱动程序汇集了长时间保持活动状态的连接.

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

更新2016.01.27:

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

https://github.com/jonnybee/OraConnTest

这只是一个小的winforms应用程序,您可以在其中添加连接字符串,然后单击按钮以启动后台工作程序,每3秒运行一次“SELECT’OK’INF 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和DATA SOURCE.

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

运行此SQL以查看实际连接:
选择sid,logon_time,prev_exec_start,wait_time_micro / 1000
来自v $session
程序如’%OraWinApp%’
按logon_time desc排序

当程序和perfmon正在运行时,您将看到此行为,因为旧连接已关闭,并且创建了与新login_time的新连接.

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读