c3p0似乎关闭了活动连接

时间:2013-08-26 08:11:16

标签: c3p0

我设置unreturnedConnectionTimeout以释放过时的连接。我认为这只是在没有任何活动的情况下关闭连接,但看起来这只是在指定时间后关闭每个连接。

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

手册说明:

  

unreturnedConnectionTimeout定义了a的长度限制(以秒为单位)   连接可能会保持签出状态。如果设置为nozero值,   未退回,签出超出此限制的连接将是   即时销毁,然后在池中更换。显然,你   必须注意将此参数设置为足够大的值   已检出的预期操作连接有时间完成。   您可以使用此参数仅解决不可靠的客户端应用程序   无法关闭()连接

由此我得出结论,活动并没有影响丢掉连接。对我来说这听起来很奇怪。为什么要扔掉活跃的连接?

谢谢, 米洛

2 个答案:

答案 0 :(得分:9)

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

unreturnedConnectionTimeout正如其名称和文档所述:未退回连接的超时。它是在不情愿的情况下实施的,以响应用户的反馈,因为如果客户可靠地签入他们检查的Connections,它将永远不会是必要或有用的。当它实现时,我添加了第二个未经请求的配置参数debugUnreturnedConnectionStackTraces,以鼓励开发人员修复客户端应用程序,而不是懒惰地依赖unreturnedConnectionTimeout

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

据我所知,您有一个预先存在的应用程序,可以维护长期存在的连接,您无法轻松修改。您希望在直接维护长期连接的应用程序和委派给池的应用程序之间建立混合体系结构。特别是,您想要的是一个库,它可以帮助您维护应用程序已经设计为保留的长期连接。

不幸的是,

c3p0不是那个库。 c3p0(与大多数连接池库一样)认为签出的连接是客户端的属性,并且在重新签入之前不对它们进行维护工作。有两个例外:unreturnedConnectionTimeout将关闭()连接如果已经签出太长时间从客户端下面退出,并且c3p0将在发生异常时无形地测试签出连接,以确定经历过异常的Connections是否适合返回池,否则必须在入住。

unreturnedConnectionTimeout不是您想要的参数。你希望在非活动一段时间后自动关闭Connections的东西,但这允许无限期地检查Connections。这样的参数可能被称为inactiveConnectionTimout,并且是一个可以想象地被添加到c3p0的功能,但是还没有。它可能不会,因为很少有应用程序长时间保持签出连接,并且c3p0充满了一些功能,可以帮助您在签入连接后或在签出和签入之间进行连接转换时观察失败。

在你的(很不寻常的)情况下,这意味着你想要的功能根本不是由库提供的。对此我很抱歉!

答案 1 :(得分:0)

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