2016-04-15 25 views
1

我理解人們中間曾經對此例外遇到過,而且大多是因爲兩種:的ResultSet關閉例外,而在接下來的同時()循環

  • 下一個()不叫
  • 的ResultSet或連接在完成任務之前關閉

這似乎不是我的情況。

我查詢與的PreparedStatement和while循環調用rs.next()

會發生什麼,我得到異常內的while循環。並且它不會在任何特定行中給我例外,它每次都會改變(我無法檢測到該模式)。

我得到這個錯誤在這個堆棧跟蹤顯示:

java.sql.SQLException: ResultSet closed 
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69) 
at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:38) 
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:437) 
at music.store.DBHelper.queryAnything(DBHelper.java:175) 
at music.store.Search.doPost(Search.java:45) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

,這是我跑

public ArrayList<Album> queryAnything(String query) throws SQLException { 
    ArrayList<Album> albums = new ArrayList<>(); 
    PreparedStatement statement = null; 
    Connection conn = null; 

    try { 
     Class.forName("org.sqlite.JDBC"); 
     conn = DriverManager.getConnection("jdbc:sqlite:" + _dbPath); 

     statement = conn.prepareStatement("SELECT " 
       + "s.id as sid, " 
       + "s.title as songTitle, " 
       + "s.price," 
       + "a.id as aid," 
       + "a.title as albumTitle," 
       + "a.artist," 
       + "a.publisher," 
       + "a.year," 
       + "a.genre " 
       + "FROM song s JOIN album a ON s.aid = a.id WHERE s.title = ? OR a.title = ? OR a.artist = ?;"); 
     statement.setString(1, query); 
     statement.setString(2, query); 
     statement.setString(3, query); 
     ResultSet rs = statement.executeQuery(); 

     Song song = null; 
     Album album = null; 
     while (rs.next()) { 
      album = new Album(rs.getString("aid"), 
           rs.getString("artist"), 
           rs.getString("albumTitle"), 
           rs.getString("genre"), 
           rs.getString("publisher"), 
           rs.getInt("year")); 

      song = new Song(rs.getString("sid"), 
          rs.getString("aid"), 
          rs.getString("songTitle"), 
          rs.getString("artist"), 
          rs.getString("albumTitle"), 
          rs.getFloat("price")); 


      if (!albums.contains(album)) { 
       albums.add(album); 
      } 

      album.set_songList(song); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (statement != null) statement.close(); 
     if (conn != null) conn.close(); 
    } 

    return albums; 
} 

的一段代碼。謝謝你們的幫助 升

+2

您似乎不止一次地從結果集中獲取一些列。當直接使用JDBC時,最好只在SQL中聲明一次並按照相同的順序獲取值。我會盡可能通過索引來指代列,而不是名稱。 嘗試首先在變量中分配所有值,然後在構造函數調用中使用變量。 – vagelis

+0

這是正確的。有用。你可以讓它成爲答案,我會標記它。謝謝,隊友 –

+0

很高興能有所幫助! :) – vagelis

回答

0

從@vagelis回答:

您似乎不止一次從結果集中獲取了一些列。當直接使用JDBC時,最好只在SQL中聲明一次並按照相同的順序獲取值。我會盡可能通過索引來指代列,而不是名稱。嘗試首先在變量中分配所有值,然後在構造函數調用中使用變量。