我们在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的Idle中不保持连接。 Oracle连接似乎从未被取消过,最终又达到了100个。
任何帮助将不胜感激