声明已经结束,没有进一步的内部信息

时间:2013-05-01 04:50:41

标签: java sql jdbc

我有一个Java Web服务器。当我在夜间闲置后访问它时,我得到以下异常:“声明已关闭,没有更多内部信息可用”。

为了调试这个,我在代码中添加了一个检查:

        try 
        {
            if (stmt.isClosed())
                throw new Exception("Aha!");
            stmt.setString(1, lemma);
            rs = stmt.executeQuery();   
        } 
        catch (SQLException e)  {
            e.printStackTrace();
        }

但是,我没有看到例外'啊哈!',我看到了这个例外:

statement has been closed, no further internal information available
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 82,918,766 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3056)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2942)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3485)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)
    at eu.excitementproject.eop.core.component.lexicalknowledge.similarity.AbstractSimilarityLexicalResource.getRulesForSide(AbstractSimilarityLexicalResource.java:122)
    ... 69 more
Caused by: java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2500)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2953)
    ... 77 more

这意味着什么,我该如何防止这种情况?

1 个答案:

答案 0 :(得分:2)

连接可能会关闭但会使语句保持打开状态。 在这种情况下,对Statement.isClosed()的调用将返回false,但仍会抛出异常。

尝试

if (stmt.isClosed() || stmt.getConnection().isClosed())
    throw new Exception("Aha!");