Java 已发出连接错误信号的PooledConnection仍在使用中

Java 已发出连接错误信号的PooledConnection仍在使用中,java,hibernate,Java,Hibernate,我发布了一个查询 我发现这个错误是在运行hibernate查询之后出现的,我不知道它是什么意思。 因此,我在几分钟后重新运行查询,然后我没有发现错误,但我想知道如何获得它以及如何修复它 WARN com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] A PooledConnection that has already signalled a Connection error is still in use! WARN com.mchan

我发布了一个查询 我发现这个错误是在运行hibernate查询之后出现的,我不知道它是什么意思。 因此,我在几分钟后重新运行查询,然后我没有发现错误,但我想知道如何获得它以及如何修复它

WARN  com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] A PooledConnection that has already signalled a Connection error is still in use!
WARN  com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] Another error has occurred [ java.sql.SQLException: Invalid state, the Connection object is closed. ] which will not be reported to listeners!
java.sql.SQLException: Invalid state, the Connection object is closed.
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.checkOpen(ConnectionJDBC2.java:1713)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.clearWarnings(ConnectionJDBC2.java:2020)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.clearWarnings(NewProxyConnection.java:933)
    at org.hibernate.util.JDBCExceptionReporter.handleAndClearWarnings(JDBCExceptionReporter.java:71)
    at org.hibernate.util.JDBCExceptionReporter.logAndClearWarnings(JDBCExceptionReporter.java:49)
    at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:472)
    at org.hibernate.jdbc.ConnectionManager.aggressiveRelease(ConnectionManager.java:429)
    at org.hibernate.jdbc.ConnectionManager.afterStatement(ConnectionManager.java:304)
    at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:572)
    at org.hibernate.jdbc.AbstractBatcher.closeStatement(AbstractBatcher.java:291)
    at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:307)
    at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:234)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1967)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
org.hibernate.exception.JDBCConnectionException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2536)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
Caused by: java.sql.SQLException: I/O Error: Software caused connection abort: recv failed
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1053)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:778)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    ... 8 more
Caused by: java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.io.DataInputStream.readFully(DataInputStream.java:195)
    at java.io.DataInputStream.readFully(DataInputStream.java:169)
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:842)
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:723)
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466)
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:103)
    at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:88)
    at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:3932)
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1046)
    ... 16 more
更新:

我的第一个代码:

Session session = getSessionfactory().openSession();
session.beginTransaction();

ArrayList<Object[]> results = null;
try {
    StringBuilder sb = new StringBuilder();
    sb.append("select p from person p ");
    sb.append("where CONTAINS(p.name , :myName) ");

    Query q = session.createSQLQuery(sb.toString());
    String myName = "Bob Jones";
    q.setString("myName", "*" + myName + "*");  

    results = (ArrayList<Object[]>) q.list();

} catch (Exception e) {
    logger.error("Error : ", e);
} finally {
    session.close();
}
会话会话=getSessionfactory().openSession(); session.beginTransaction(); ArrayList结果=null; 试一试{ StringBuilder sb=新的StringBuilder(); sb.追加(“从人p中选择p”); sb.append(“wherecontains(p.name,:myName)”); Query q=session.createSQLQuery(sb.toString()); 字符串myName=“Bob Jones”; q、 设置字符串(“myName”,“*”+myName+“*”); 结果=(ArrayList)q.list(); }捕获(例外e){ 错误(“错误:”,e); }最后{ session.close(); } 它不起作用, 这是第二个版本:

Session session = getSessionfactory().openSession();
session.beginTransaction();

ArrayList<Object[]> results = null;
try {
    StringBuilder sb = new StringBuilder();
    sb.append("select p from person p ");
    sb.append("where CONTAINS(p.name , :myName) ");

    Query q = session.createSQLQuery(sb.toString());
    String myName = "Bob Jones";
    q.setString("myName", "\"*" + myName + "*\""); 

    results = (ArrayList<Object[]>) q.list();

} catch (Exception e) {
    logger.error("Error : ", e);
} finally {
    session.close();
}
会话会话=getSessionfactory().openSession(); session.beginTransaction(); ArrayList结果=null; 试一试{ StringBuilder sb=新的StringBuilder(); sb.追加(“从人p中选择p”); sb.append(“wherecontains(p.name,:myName)”); Query q=session.createSQLQuery(sb.toString()); 字符串myName=“Bob Jones”; q、 设置字符串(“myName”,“\”*“+myName+”*\”); 结果=(ArrayList)q.list(); }捕获(例外e){ 错误(“错误:”,e); }最后{ session.close(); }
尝试运行第二个版本时,出现上述错误。

您的事务管理和/或连接管理代码可能已关闭。您似乎没有在发生错误后释放到连接池的连接,并尝试重新使用它。这可能是由于使用了错误的异常处理习惯用法造成的。

使用jTDS,您可能试图连接到MS SQL或Sybase。根据你发布的代码,一切看起来都很好。我建议您升级驱动程序并提高日志记录级别,以获取更多详细日志。

添加我的2美分,似乎与数据库的网络连接存在一些问题

原因:java.sql.SQLException:I/O错误:软件原因 连接中止:recv失败


同时尝试使用另一个DB进行测试,以便检查DB是否可能是随机发生的原因

如果池空闲超时(使用测试查询检查连接)在数据库连接超时之前运行(没有从客户端听到任何消息),也会发生这种情况,即DB服务器决定删除,而客户端没有意识到这一点。

尝试使用本机数据库工具建议的索引,这可能是因为所有其他连接都需要时间从表中获取响应,并且无法建立新的连接,因此连接已关闭警告。

感谢您的回复,我不明白“您在发生错误后没有释放到连接池的连接,并尝试重新使用它”是什么意思。你能解释一下我该怎么做吗?如果不看你的代码,我就帮不了你,尤其是连接获取/事务管理部分。你好,有人能帮我吗?谢谢此错误随机出现,我必须修复它。我读了很多论坛,但我不能解决它。@MarkoTopolnik我也有同样的错误。我获取一个会话,如果不存在,则获取一个新会话,然后获取session.getTransaction();如果还没有活动的,我将对其使用beginTransaction。这就是这种情况发生的时候。我以前提交过事务。对我来说,它可以填充上百次,但后来我遇到了这个问题,可能是因为连接池用完了。我不知道如何将它返回到池中,因为它是由c3p0使用hibernate属性配置的。我所做的就是sessionFactory().getSession().getTransaction(),谢谢你的回复。我在MS SQL 2008中使用jTDS 1.2.4。有没有可能这个版本的jTDS不支持名为parameter的查询?我尝试将jTDS版本升级到1.2.7,然后再升级到1.3.0,但这并不能解决问题如果sqlQuery中有错误,c3p0会记住还是保留它?或者是否存在“清理”c3p0 pooledConnection的代码?因为当我测试查询时,我会出错如何检测关闭对象连接的内容?或者是什么连接错误?