我有一个连接到Oracle数据库的Mule应用程序。该应用程序是允许执行SQL存储过程的SOAP api。我的连接器设置为使用连接池,并且我一直在监控连接本身。我有一个最大池大小为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。
发布于 2020-04-26 06:35:57
您应该使用一个连接池实现,使您能够控制连接的生存时间。理想情况下,池还应该提供验证查询来检测陈旧查询。
例如,c3p0池有一个名为maxConnectionAge的配置,它似乎符合您的需要。maxIdleTime也可能会引起人们的兴趣。
发布于 2016-09-27 17:26:17
你可以尝试使用Oracle Transparent Connection Caching,如果你不想使用Mule.
为了更好地理解这个案例,有几个问题:
发布于 2016-10-04 11:05:53
通过JDBC的数据库连接旨在保持开放状态,以便于重用。一般来说,大多数数据库技术,包括下一代NoSQL数据库,都有昂贵的启动和关闭成本。数据库连接应该在应用程序启动时建立,并在应用程序关闭时正常关闭。您不应该在每次使用后都关闭连接。
甲骨文提供了一个名为UCP的连接池。UCP提供了控制stale connections的选项,其中包括设置最大重用时间和非活动连接超时等选项。
这对于将资源返回到应用程序以及检查断开的连接非常有用。无论如何,在关闭连接之前,应该多次重用连接。
https://stackoverflow.com/questions/39631539
复制相似问题