2013-08-21 22 views
1

有时候,我多次看到我日志中的以下错误:如何让Squeryl释放关闭连接回C3P0?

com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] A PooledConnection that has already signalled a Connection error is still in use! 
com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] Another error has occurred [ org.postgresql.util.PSQLException: This connection has been closed. ] which will not be reported to listeners! 
org.postgresql.util.PSQLException: This connection has been closed. 
     at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822) 
     at org.postgresql.jdbc2.AbstractJdbc2Connection.rollback(AbstractJdbc2Connection.java:839) 
     at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:855) 
     at org.squeryl.dsl.QueryDsl$class._executeTransactionWithin(QueryDsl.scala:131) 
     at org.squeryl.dsl.QueryDsl$class.transaction(QueryDsl.scala:78) 
     at org.squeryl.PrimitiveTypeMode$.transaction(PrimitiveTypeMode.scala:40) 

下面是我自己的代码到我transaction {}块的点的轨迹。

我的软件在引发异常后重复transaction {},但似乎再次使用相同(关闭)连接,因此下一次尝试也失败。奇怪的是,这需要相当长的时间,有时需要50秒,有时甚至需要2分钟。人们会认为一个封闭的连接会立即失败。

我该如何让Squeryl将这个连接释放到池中并获得一个新的连接?

+0

您确实使用了一个新的事务{}块,是吗? – VasyaNovikov

+0

我重新执行同一个,例如: while(!done){try {transaction {...} done = true} catch {case _ =>}} –

+0

catch {...}是什么意思如果你登录它? 如果您认为这样可以,请将代码和内部异常添加到问题中:否则代码不会格式化。 – VasyaNovikov

回答

1

我发现了这是为什么发生。我需要使用Squeryl不支持的JDBC功能。所以我得到了Squeryl的联系并直接使用它。但是我有一个错误,准备好的声明没有被关闭。这导致无用的连接被重复使用。我不确定这是怎么发生的,为什么发生。但只要我把这个声明的结尾放在一个finally块里,一切都开始了。现在,当Squeryl第二次进入事务处理块时,它会从c3p0收到一个新的连接。

对于其他人看到相同的错误,我也发现,即使没有任何错误,你也可以得到c3p0错误(上面问题文本中的两个错误)。如果你的线程持有数据库连接是忙的(在我的情况下是一个Thread.sleep(),用于测试)和c3p0通知之前,你的连接已经死了,那么你可以得到关于仍然在使用中的死连接的错误。在这种情况下,这是一个非常正常的情况,只是一个问题,哪个线程首先看到问题 - 没有什么可担心的。

+0

只是要清楚:这些都不是Squeryl问题。当交易结束时,Squeryl将*总是*关闭连接,如果您的池库运行正常,它将返回连接池。你可以在这里看到自己的代码:https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/Session.scala#L53。您引用的日志消息也来自C3P0,而不是Squeryl。 –

+0

我很抱歉。我现在重写了第一段,以反映我不知道是什么导致了这种行为。我还在第二段中修正了一个错误,当然c3p0注意到一个单独的线程表示连接已经死亡,而不是Squeryl。 –