不活动后关闭数据库连接

时间:2016-09-22 06:14:00

标签: database connection timeout mule database-connection

我有一个连接到Oracle数据库的Mule应用程序。该应用程序是一个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

当呼叫完成后,我希望连接在一段时间后关闭。这不会发生。我注意到,当应用程序在服务器上运行时,连接仍然从7月开始(这是几个月前)。

到目前为止,我发现实际上在几秒钟后关闭连接的唯一方法是启用XA事务并设置连接超时。但是,这完全会影响应用程序的性能,这是不必要的开销。

如何在不使用XA连接的情况下添加此类超时?我希望我的数据库连接在20秒不活动后关闭。

谢谢

编辑: 使用通用数据库连接器 - Mule版本3.8.0 我们拥有允许进入数据库的最大连接数,我们有多个此流的实例正在运行。这意味着连接由其中一个实例保留,导致其他实例无法获得新连接。

我们遇到的具体问题是,一个实例仍然保留了120个连接,即使它上次运行的时间是几周之前。当第二个实例请求更多连接时,它只能得到30,因为数据库端的最大值是150。

3 个答案:

答案 0 :(得分:0)

如果Mule没有运气,你可以尝试使用Oracle Transparent Connection Caching

更好地理解案例的几个问题:

  1. 您正在使用哪种类型的连接器(jdbc /数据库)以及哪种版本的Mule是什么?
  2. 为什么你关心之后的连接?你在观察其他一些你不满意的症状吗?

答案 1 :(得分:0)

通过JDBC进行的数据库连接旨在保持打开状态,以便重用。通常,包括下一代NoSQL数据库在内的大多数数据库技术都具有昂贵的启动和关闭成本。应用程序启动时应建立数据库连接,并在应用程序关闭时正常关闭。每次使用后都不应该关闭连接。

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

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

答案 2 :(得分:0)

您应该使用连接池实现,该实现可以控制连接的生存时间。理想情况下,池还应该提供验证查询以检测过时的查询。

例如,c3p0池具有名为maxConnectionAge的配置,该配置似乎符合您的需求。 maxIdleTime也可能很有趣。