在闲置后关闭数据库连接

11

我有一个Mule应用程序,它连接到一个Oracle数据库。该应用程序是一个SOAP API,允许执行SQL存储过程。我的连接器已经设置为使用连接池,并且我一直在监视这些连接。我最大的连接池大小为20,当调用数据库时,我可以看到它们正在打开(netstat -ntl | grep PORTNUMBER)。

 tcp4       0      0  IP HERE     OTHER IP HERE       SYN_SENT
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4       0      0  IP HERE     OTHER IP HERE       ESTABLISHED
 tcp4      10      0  IP HERE     OTHER IP HERE       ESTABLISHED
当电话结束时,我希望连接在一定时间后关闭,但事实并非如此。我注意到当应用程序在服务器上运行时,仍然保持着从七月开始(几个月前)的开放连接。
到目前为止,我找到的唯一能够在几秒钟后关闭连接的方法是启用XA事务并设置连接超时。但是,这会完全破坏应用程序的性能,并且是不必要的开销。
我该如何在不使用XA连接的情况下添加这样的超时呢?我希望我的数据库连接在20秒内无活动后关闭。
谢谢
编辑: 使用通用数据库连接器-Mule版本3.8.0 我们允许最大连接数到数据库,我们有多个实例正在运行。这意味着连接由一个实例保留,这使得其他实例无法获取新连接。
我们遇到的具体问题是,即使上一次运行已经过去几周,某个实例仍然保留了120个连接。当第二个实例请求更多连接时,由于数据库侧的最大连接数为150,因此只能获得30个连接。
3个回答

1
你应该使用一个连接池实现来控制连接的存活时间。理想情况下,连接池还应提供验证查询以检测过期查询。
例如,c3p0 池具有一个名为 maxConnectionAge 的配置项,似乎符合您的需求。maxIdleTime 也可能会引起兴趣。

0

如果使用Mule没有成功,您可以尝试使用Oracle透明连接缓存

为了更好地理解情况,有几个问题:

  1. 您正在使用哪种类型的连接器(jdbc/数据库),以及它是哪个版本的Mule?
  2. 为什么您关心连接之后仍然保持打开状态?您是否观察到其他不满意的症状?

0

JDBC通过数据库连接的方式被设计为保持开放状态,以便重复使用。一般来说,包括下一代NoSQL数据库在内的大多数数据库技术都具有昂贵的启动和关闭成本。应该在应用程序启动时建立数据库连接,并在应用程序关闭时优雅地关闭它们。不应该在每次使用后关闭连接。

Oracle提供了一个名为UCP的连接池。UCP提供了控制过期连接的选项,其中包括设置最大重用时间和非活动连接超时等其他选项。

这对于将资源返回给应用程序以及检查断开的连接非常有用。无论如何,在关闭之前应该多次重复使用连接。


我知道连接不应该在每次使用后关闭,而是可以使用池进行重复利用。 然而,连接保持开放2个月有点太长了。 应用程序本身从未关闭。它不应该关闭,但是每当它在一定时间内没有使用连接时,我希望它关闭。无论如何,这是一个特定于Mule的问题,我想知道如何在Mule中使用这个UCP。 我尝试使用bean来配置我的数据库连接器,但与仅使用默认的Mule连接器相比,性能总是更差。 - DenCowboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接