我们遇到了连接在 Oracle 中保持空闲的问题。为您提供一些背景知识,我们的用户连接到 Denodo,而 Denodo 又具有连接到 Oracle 的数据源。此数据源使用一个用户名和密码并创建一个池。池的初始大小为 4,最大活动连接数为 20。
连接开始使用 JDBC、ODBC 等从客户端传入。一些客户端是请求数据的其他服务器(Spotfire 和 BusinessObjects),而其他客户端只是使用 R、python、C# 等开发脚本的普通用户。他们还可以连接 DBeaver 等工具。Oracle 用户具有最多可保持 100 个空闲连接的设置。
现在,用户使用他们的脚本进行连接,并且他们拥有打开与 Denodo 的连接、通过查询获取数据、获取返回的数据并关闭与 Denodo 的连接的代码(我们已经检查过)。Denodo 依次执行相同的操作并打开与 Oracle 的连接,将查询从客户端传递到 Oracle,获取数据并将其转发回客户端。这是我们不太确定的部分。我们期待 Denodo 关闭与 Oracle 的连接,但它没有。连接在 Oracle 中保持打开状态并显示为空闲。最终我们有足够的空闲连接来填满为用户设置的配额 (100)。
基于此,我们在 Denodo 中对与 Oracle 的连接进行了一些调整,并将这些设置应用于连接:
FETCHSIZE = 10000
BATCHINSERTSIZE = 200
VALIDATIONQUERY = 'SELECT COUNT(*) FROM SYS.DUAL'
INITIALSIZE = 4 #initial size of pool
MAXIDLE = 25 #max number of idle connections
MINIDLE = 5 #min number of idle connections
MAXACTIVE = 20 #max active in the pool
EXHAUSTEDACTION = 1
TESTONBORROW = true
TESTONRETURN = false
TESTWHILEIDLE = false
TIMEBETWEENEVICTION = 300000 #time between evictions in milliseconds
NUMTESTPEREVICTION = 10 #10 connections to be evaluated for eviction
MINEVICTABLETIME = 900000 #min evictable time in milliseconds
POOLPREPAREDSTATEMENTS = false
MAXSLEEPINGPS = 4
INITIALCAPACITYPS = 8
应用此设置后,我们认为它会清除空闲连接。问题是它没有。您可以看到连接开始蔓延,最终再次填满并且不允许任何其他连接。
我希望看到的是 Denodo 打开它需要的连接,使用它并释放它。不要在 Oracle 的空闲状态下保持连接。Oracle 连接似乎从未被驱逐,最终它们再次达到 100。
任何帮助,将不胜感激