因为这是一个 Web 应用程序,所以您知道何时需要关闭结果集:在请求结束时。您可以在请求范围内注册您的结果集/连接,并在请求结束时将它们全部关闭。这就是 Cold Fusion(在 Java 之上运行)处理它的方式。
或者你可以像Myna一样默认返回一个“物化”集合,或者采用一个可选的行处理程序,它将针对原始结果集执行。在第二种情况下,您可以直接访问诸如 BLOB 之类的东西,这些东西几乎总是需要特殊处理并且仅将内容放入集合中是不切实际的,并且您知道 rowHandler 何时完成,因此您可以关闭结果集/连接
更新:
这是请求结束时关闭方法的一个简单示例
public class Query {
static public ConcurrentHashMap openResultSets = new java.util.concurrent.ConcurrentHashMap();
public ResultSet runQuery(String sql) throws SQLException{
//set up connection, run query
ResultSet rs = statement.executeQuery();
if (Query.openResults.get(Thread.currentThread().getId()) == null){
Query.openResults.put(Thread.currentThread().getId(),new Vector())
}
Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId())
openRs.add(rs);
return rs;
}
public void onRequestEnd(String sql) {
Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId());
if (openRS != null){
for (ResultSet rs : openRS.values()){
try{
rs.close();
} catch(Exception e){}
}
}
//do any other request end cleanup of connections, etc
}
}
//in your servlet
public class Query extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
ResultSet rs = Query.runQuery("select * from AWESOME");
//do awesome stuff, maybe load other classes that can run runQuery
Query.onRequestEnd();
}
}
这并不理想,但我不知道您使用的是什么框架。通过 setAttribute()/getAttribute() 将它保存在 HttpServletRequest 对象中可能是有意义的,但这需要将请求传递给使用它的每个方法。无论哪种方式,您只需要保留一组打开的结果集并在请求结束时关闭它们。使用某种框架使这变得容易得多。