我想从执行查询的函数中传出结果集并关闭连接。
但是一旦其父Connection关闭并抛出
,ResultSet就会失效java.sql.SQLException: Operation not allowed after ResultSet closed
如何避免这种情况?
答案 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()
),如果是,则关闭连接。