2013-05-01 35 views
1

我有一個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

http://stackoverflow.com/questions/2983248/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-fai – NINCOMPOOP 2013-05-01 04:52:51

回答

1

可能會發生連接關閉但語句打開。 在這種情況下,對Statement.isClosed()的調用將返回false,但異常仍將被拋出。

嘗試

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