如何防止ResultSet在Connection关闭时失效?

时间:2010-10-24 20:44:01

标签: java scala jdbc database-connection resultset

我想从执行查询的函数中传出结果集并关闭连接。

但是一旦其父Connection关闭并抛出

,ResultSet就会失效
java.sql.SQLException: Operation not allowed after ResultSet closed

如何避免这种情况?

4 个答案:

答案 0 :(得分:7)

你做不到。如果要获取所有数据,请循环ResultSet并将数据插入到您的集合中。

看看commons-dbutils - 它有很多有用的助手。

答案 1 :(得分:6)

还要考虑使用断开连接的结果集:CachedRowSet。快速谷歌搜索给了我:Using CachedRowSet to Transfer JDBC Query Results Between Classes

答案 2 :(得分:5)

你想把你的想法彻底改变!

创建一个可以对ResultSet执行某些操作的函数, 并将其作为闭包传递给运行查询的函数。

def withQuery[T](query:String)(template: ResultSet => T) : T = {
  val resultSet = runQuery(query)
  val ret = template(resultSet)
  resultSet.close
  ret
}

val output = withQuery("select * from ...") {
  resultSet =>
  //some expression that generates a string from the resultset
}

println(output)

答案 3 :(得分:2)

这不是ResultSet的工作原理。它不存储数据本身,它只是作为它的接口。

你可以尝试的是让返回ResultSet的类保留一个已发布的列表。使用ResultSet的每段代码在完成后都可以在其上调用close()。然后第一个类可以检查已经发出的所有ResultSet是否已关闭(使用isClosed()),如果是,则关闭连接。