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;
}
的一段代碼。謝謝你們的幫助 升
您似乎不止一次地從結果集中獲取一些列。當直接使用JDBC時,最好只在SQL中聲明一次並按照相同的順序獲取值。我會盡可能通過索引來指代列,而不是名稱。 嘗試首先在變量中分配所有值,然後在構造函數調用中使用變量。 – vagelis
這是正確的。有用。你可以讓它成爲答案,我會標記它。謝謝,隊友 –
很高興能有所幫助! :) – vagelis