我在glassfish服务器上使用open esb。 我们有一个与as400数据库一起使用的连接池。
每隔几天我们就会收到此错误: 分配连接时出错。原因:使用中的连接等于最大值 池大小和过期的最大等待时间。无法分配更多连接
缓解cp的最佳方法是重启服务器。 我们还设法设置了另一个具有相同属性的cp。
我的问题是: 有没有办法主动“告诉”cp释放所有打开的连接?
干杯, 叶兰
答案 0 :(得分:5)
在此之前,找出未正确释放连接的原因。听起来有一个地方会被遗忘(你在finally子句中都有close()吗?)。
我强烈推荐Michael Nygards“发布它!”用于使软件生产准备就绪的技术。
编辑#1:如果我正确理解你的描述你的后端程序进入QSYSOPR中的MSGW,这导致挂起连接,直到给出响应,在你的情况下接近永远不会。是否可以选择使用默认回复为“C”的配置文件,它允许故障作为例外传播给您?
否则,您可以为24小时的连接或整个服务器设置超时时间?然后至少连接将最终关闭。该解决方案虽然不能扩展,但可以使开发更容易。
请注意,也可以有一个单独的监控线程,定期查找MSGW并在抓取回拨堆栈后自动发送答案进行死后分析。
答案 1 :(得分:1)
如果您可以在几秒钟内确定“正常”连接使用的上限,则可以使用GlassFish的连接泄漏检测机制。在GF的管理控制台(我使用v2.1)中,转到Resources / JDBC / Connection Pools / [your cp] / Advanced,在Connection Settings下将Leak Reclaim设置为true,并设置Leak Timeout的时间(秒)。
答案 2 :(得分:1)
我遇到了这个问题,原来是交易管理。将@TransactionManagement(TransactionManagementType.BEAN)添加到类中解决了问题。在我的情况下,我不想要任何交易代码,但您的里程可能会根据您的要求而有所不同。
答案 3 :(得分:0)
您在对Andersen的评论中提到您正在收到AS400消息。您可以设置这些消息的自动答案,以避免打开异常消息。检查AS400上的WRKRPYLE(工作回复列表条目)命令,以自动回复这些错误并避免挂起。