我有循环遍历对象队列的代码,这些对象描述了需要存储在 MySQL 数据库中的信息。我最近稍微更改了代码以关闭finally
整个应用程序中的一个块中的连接,以便在发生异常时我们不会泄漏任何内容。它工作得很好,除了:
有些用户有时会看到错误No operations allowed after resultset closed
- 我知道错误的含义,但我不知道如何关闭它。
违规代码:
PreparedStatement s = null;
Connection conn = null;
try {
if( !queue.isEmpty() ){
conn = Prism.dbc();
if(conn == null || conn.isClosed()){
return;
}
conn.setAutoCommit(false);
s = conn.prepareStatement("INSERT query goes here");
int i = 0;
while (!queue.isEmpty()){
Handler a = queue.poll();
if( a == null || a.isCanceled() ) continue;
// .. value setting code here
s.addBatch();
if ((i + 1) % perBatch == 0) {
s.executeBatch(); // Execute every x items.
}
i++;
}
s.executeBatch();
conn.commit();
}
} catch (SQLException e) {
// error logging code
} finally {
if(s != null) try { s.close(); } catch (SQLException e) {}
if(conn != null) try { conn.close(); } catch (SQLException e) {}
}
错误指向该conn.setAutoCommit(false);
行。但是,我看不到此时连接是如何关闭的,因为我正在显式检查其上方的已关闭/空连接。