3

我设置unreturnedConnectionTimeout释放陈旧的连接。我假设这只会关闭没有任何活动的连接,但看起来这只是在指定时间后关闭每个连接。

这是一个错误还是“按设计”?

手册指出:

unreturnedConnectionTimeout定义连接可以保持签出状态的限制(以秒为单位)。如果设置为 nozero 值,超过此限制的未返回、签出连接将被立即销毁,然后在池中替换。显然,您必须注意将此参数设置为一个足够大的值,以使对已签出连接的所有预期操作都有时间完成。您可以使用此参数仅解决无法关闭()连接的不可靠客户端应用程序

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

谢谢,米洛

4

2 回答 2

9

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

unreturnedConnectionTimeout正是它的名称和文档状态:未返回连接的超时。它是根据用户反馈不情愿地实施的,因为如果客户可靠地签入他们签出的连接,它就永远没有必要或有用。当它被实现时,我添加了第二个未经请求的配置参数debugUnreturnedConnectionStackTraces,以鼓励开发人员修复客户端应用程序,而不是懒惰地依赖unreturnedConnectionTimeout

unreturnedConnectionTimeout的定义没有什么奇怪的。通常,使用连接池的应用程序不会长时间保持连接签出。这样做违背了连接池的目的,即允许应用程序根据需要获取连接,而不会造成很大的性能损失。连接池的替代方法是让应用程序签出连接并长期保留它们,因此它们始终可供使用。但是维护长寿命的连接变得很复杂,因此大多数应用程序将其委托给像 c3p0 这样的池化库。

我了解您有一个预先存在的应用程序来维护长期连接,您无法轻易修改。您希望在直接维护长期连接的应用程序和委托给池的应用程序之间建立混合架构。特别是,您需要一个库来帮助您维护您的应用程序已经设计为保留的长期连接。

不幸的是,c3p0 不是那个库。c3p0(像大多数连接池库一样)将签出的连接视为客户端的属性,并且在重新签入之前不对它们进行维护工作。这有两个例外:unreturnedConnectionTimeout将关闭()从客户端下面的连接如果签出时间过长,c3p0会在出现异常时无形地测试签出的Connection,以确定遇到异常的Connection是否适合返回池中,否则必须在签入时销毁。

unreturnedConnectionTimeout不是您想要的参数。您希望在一段时间内处于非活动状态时自动关闭连接,但允许无限期地签出连接。这样的参数可能被称为inactiveConnectionTimout,并且是可以想象添加到 c3p0 的功能,但尚未添加。可能不会,因为很少有应用程序会长时间保持签出连接,而 c3p0 充满了帮助您在签入连接后或在签出和签入之间转换连接时观察故障的功能。

在您的(非常不寻常的)情况下,这意味着您想要的功能根本没有由库提供。我对此感到抱歉!

于 2013-08-26T10:30:58.697 回答
1

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

于 2013-08-26T08:30:39.770 回答