我有一个连接到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 .
2 回答
你可以尝试使用Oracle Transparent Connection Caching,如果没有运气Mule .
一些问题可以更好地理解案例:
您正在使用哪种类型的连接器(jdbc /数据库)以及哪种版本的Mule?
为什么你关心之后的连接?你在观察一些你不满意的症状吗?
通过JDBC进行的数据库连接旨在保持打开状态,以便重用 . 通常,包括下一代NoSQL数据库在内的大多数数据库技术都具有昂贵的启动和关闭成本 . 应用程序启动时应 Build 数据库连接,并在应用程序关闭时正常关闭 . 每次使用后都不应该关闭连接 .
Oracle提供了一个名为UCP的连接池 . UCP提供控制stale connections的选项,包括设置最大重用时间和非活动连接超时等选项 .
这对于将资源返回到应用程序以及检查断开的连接非常有用 . 无论如何,连接应该在关闭之前重复使用多次 .