C3P0似乎关闭了活动连接。

3
我将unreturnedConnectionTimeout设置为释放陈旧连接。我认为这只会在没有任何活动的情况下关闭连接,但实际上它似乎会在指定时间后关闭每个连接。
这是一个错误还是设计如此?
手册说明如下:

unreturnedConnectionTimeout定义了连接检出后可以保留的最长时间(以秒为单位)。如果将其设置为非零值,则超过此限制的未归还、已检出连接将被立即销毁,然后在池中替换。显然,您必须小心地将此参数设置为足够大的值,以便所有已检出连接上的操作都有足够的时间完成。您可以使用此参数仅解决不可靠的客户端应用程序无法关闭()连接的问题。

由此我得出结论,活动不会影响连接的丢弃。对我来说,这听起来很奇怪。为什么要丢弃活动连接呢?
谢谢, Milo
2个回答

9

我是c3p0的作者,也是你引用的段落的作者。

unreturnedConnectionTimeout的含义和文档所述完全一致:它是针对未归还连接的超时时间。这是对用户反馈的勉强实现,因为如果客户端可靠地检查他们检出的连接,则永远不需要或有用。在实施时,我添加了第二个非请求的配置参数,debugUnreturnedConnectionStackTraces,以鼓励开发人员修复客户端应用程序,而不是懒惰地依赖unreturnedConnectionTimeout

unreturnedConnectionTimeout的定义没有什��奇怪的。通常,使用连接池的应用程序不会长时间保留已签出的连接。这样做违背了连接池的目的,即允许应用程序根据需要获取连接而不会产生大量的性能损失。与连接池的替代方案是应用程序签出连接并长时间保留它们,以便始终可用于使用。但是,维护长期的连接变得复杂,因此大���数应用程序将其委托给像c3p0这样的池库。

我了解您拥有一个现有的应用程序,该应用程序保持长期保留的连接,您无法轻松修改。您希望在直接保留长期连接和委托给池之间实现混合体系结构。特别地,您想要一个库,可以帮助您维护已经设计好保留的长期连接。

不幸的是,c3p0不是那个库。(像大多数连接池库一样)c3p0认为已签出的连接是客户端的属性,并且在客户端检返回之前不对它们进行任何维护工作。有两个例外:如果已签出的连接超时,unreturnedConnectionTimeout会在客户端之外关闭连接(); 当发生异常时,c3p0将在不可见地测试签出的连接,以确定经历异常的连接是否适合返回到池中,否则必须在签入时销毁。

unreturnedConnectionTimeout并不是您想要的参数。您希望有一个能够在连接一段时间未活动后自动关闭连接,但允许连接无限期签出的功能。这样的参数可能被称为inactiveConnectionTimout,并且可能会添加到c3p0中,但实际上并没有。这可能是因为很少有应用程序长时间持有签出的连接,而c3p0充满了许多功能,可以帮助您观察连接在签入时或在签入和签出之间的故障。

在您(相当罕见)的情况下,这意味着库中没有提供您需要的功能。对此我感到非常抱歉!


哇,非常感谢您的回答和澄清,我感到非常荣幸。应用程序设计是我和一位同事几年前完成的。自那以后我们学到了很多:)您是否接受添加“inactiveConnectionTimout”参数的代码? - Milo van der Zee
理论上,我不反对这个功能。但实际上,它会有点烦人去实现。在内部,池库(com.mchange.v2.resourepool.BasicResourcePool)没有概念,即它汇集的资源可能是“活动的”或“非活动的”。该概念必须添加到“IndexCards”中,以记录各个资源的状态(以TVL方式:并非所有资源都具有可跟踪的活动状态,因此应该有带外值来表示未知或不适用)。 - Steve Waldman
然后代理代码生成器需要被修改为向它们的父NewPooledConnection报告任何活动。接着,NewPooledConnection会想要向其所属的池报告活动,但是(遵循JDBC规范架构),PooledConnections只通过Connection和Statement事件与池进行通信,这些事件只报告关闭和错误。c3p0的NewPooledConnection将不得不定义一个自定义事件类型或持有一个直接父引用来报告活动。 - Steve Waldman
最终,这将是对0.9.5系列过于破坏性的添加,但可以在0.9.6中实现。但我敢打赌,改变您的应用程序会比将此功能添加到c3p0更容易,而且我认为您的情况并不常见,额外的工作不值得作为库的改进。 - Steve Waldman

1

unreturnedConnections 可能是活动状态,这取决于执行例如数据库查询的时间。您应该将其超时设置为大于您的应用程序可以预期的最长操作时间。有时,如果您知道该值应该足够,并且 c3p0 仍在关闭活动连接,则意味着连接泄漏到某个地方(可能没有正确关闭)。


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