我们有一个使用c3p0库的服务,我们已经添加了这个属性unreturnedConnectionTimeout以确保unreturnedconnections正在超时,但显然c3p0没有抛出异常,只是在我将debugUnreturnedConnectionStackTraces属性设置为true时打印异常堆栈跟踪。
在这种情况下,我们的服务线程正在等待c3p0库等待连接,因为没有异常会被抛出。
你可以给我们一个如何处理这种情况的解决方案吗?
答案 0 :(得分:0)
你误解了unreturnedConnectionTimeout
。
unreturnedConnectionTimeout
没有抛出异常。如果设置正确,只有在泄漏连接时才有效。某些客户端已检出连接但未能将其重新检入。未发生异常。没有客户端受此影响,除了间接,因为现在可用于检出的Connections更少。 c3p0只是杀死了未回复的连接。没有人可以通知这个。
如果你的客户端无限期地等待连接,那听起来好像你有一个没有被unreturnedConnectionTimeout
清理的连接泄漏,或者更可能的是,你发现连接等待的时间长得令人无法接受作为您设置的超时。
您应该做的是查看记录的堆栈跟踪,假设您将debugUnreturnedConnectionStackTraces
设置为true
。这些堆栈跟踪不表示异常(即使它们可能打印为“DEBUG”异常) - 但它们会显示检出从未返回的Connections的代码路径。修复此问题,修复Connection泄漏,所有问题都将消失。看看Connection是如何签出的,在你的代码中找到它,并确保在一些finally
块中不能关闭所有签出的Connection,或者更容易通过Java 7发布, try-with-resources