是的,您可以重用该对象,但关闭返回的对象已打开结果集。Statement
ResultSet
executeQuery
有关说明,请参阅 javadoc
默认情况下,每个语句对象只能同时打开一个 ResultSet 对象。因此,如果一个 ResultSet 对象的读取与另一个对象的读取交错,则每个对象都必须由不同的 Statement 对象生成。如果存在打开的语句对象,则 Statement 接口中的所有执行方法都会隐式关闭语句的当前 ResultSet 对象。
因此,将发生以下情况:
// load driver
Connection con = DriverManager.getConnection(..);
Statement stmt = con.createStatement();
ResultSet result = stmt.executeQuery("select ..");
// do something with result ... or not
ResultSet result2 = stmt.executeQuery("select ...");
// result is now closed, you cannot read from it anymore
// do something with result2
stmt.close(); // will close the resultset bound to it
例如,您可以在 jTDS 项目中找到 Statement 的开源实现。在 Statement.executeQuery() 方法中,您可以看到对 initialize()
的调用,该调用关闭了所有已打开的结果集
protected void initialize() throws SQLException {
updateCount = -1;
resultQueue.clear();
genKeyResultSet = null;
tds.clearResponseQueue();
// FIXME Should old exceptions found now be thrown instead of lost?
messages.exceptions = null;
messages.clearWarnings();
closeAllResultSets();
}