【发布时间】:2010-10-24 20:44:00
【问题描述】:
我想从一个执行查询并关闭连接的函数中传递一个结果集。
但是 ResultSet 会在其父 Connection 关闭并抛出时立即失效
java.sql.SQLException: Operation not allowed after ResultSet closed
如何避免这种情况?
【问题讨论】:
标签: java scala jdbc database-connection resultset
我想从一个执行查询并关闭连接的函数中传递一个结果集。
但是 ResultSet 会在其父 Connection 关闭并抛出时立即失效
java.sql.SQLException: Operation not allowed after ResultSet closed
如何避免这种情况?
【问题讨论】:
标签: java scala jdbc database-connection resultset
你不能。如果您想获取所有数据,请循环 ResultSet 并将数据插入您的集合中。
看看commons-dbutils - 它有很多有用的助手。
【讨论】:
还可以考虑使用断开连接的结果集:CachedRowSet。快速谷歌搜索给了我这个:Using CachedRowSet to Transfer JDBC Query Results Between Classes。
【讨论】:
你想彻底改变你的想法!
创建一个对 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)
【讨论】:
结果集不是这样工作的。它本身并不存储数据,它只是充当它的接口。
您可以尝试让返回ResultSets 的类保留它已发出的类的列表。使用 ResultSet 的每段代码在使用完后都可以在其上调用close()。然后第一个类可以检查所有已经发出的ResultSets是否已经关闭(使用isClosed()),如果是,则关闭连接。
【讨论】: