Groovy SQL错误 - 此ResultSet已关闭

时间:2012-09-04 20:04:38

标签: sql postgresql groovy

我正在使用Groovy的Sql对象在postgres db上执行查询。查询正在执行如下:

List<Map> results = sql.rows("select * from my_table")
List<Map> result2= sql.rows("select * from my_second_table")

我有一个groovy方法执行两个查询,然后进行一些处理来循​​环数据以生成不同的数据集,但是,在某些情况下,我收到postgres异常"This ResultSet is closed"错误。

搜索过后,我原本以为这可能与此处的问题有关:SQLException: This ResultSet is closed(运行多个查询并尝试在事后查看结果集中的数据) - 但是,我们似乎只是得到了在相当高的负载下的异常 - 这表明它并不像第一个数据集在执行第二个查询时关闭一样简单,就好像这是我希望它一直发生的情况。

任何人都可以了解Groovy的Sql对象如何处理这些情况或建议可能出现的问题?

2 个答案:

答案 0 :(得分:3)

Groovy SQL是一种奇怪的猫。易于使用简单的东西。如果您有更复杂的场景,最好使用其他东西。 IMHO

我首先建议执行一个查询,将结果存储到集合中,执行第二个查询并将结果存储在集合中,然后在两个集合而不是结果集之间执行操作。如果您的数据太大,请在开始进行聚合之前找到一些在本地存储数据的方法。

如果您不喜欢这样,您可能需要检查GDK源代码,以便更好地了解与结果集等相关的Sql.getInstance()所做的事情。然后您可以回避您的任何地方不经意间踩到了。

答案 1 :(得分:0)

也许

List<Map> results = sql.rows("select * from my_table")
List<Map> result2= sql.rows("select * from my_second_table")

即使在普通Java中也不会起作用(正如在声明中进行第二次调用时提供的答案中已经说过的那样,必须释放在前一次调用期间专用的所有资源)。正如mentioned by @Todd W Crone Groovy可以优化资源,例如动态释放它们或根据某些运行不释放它们。

其实我只尝试过一次查询。例如。我试图得到ResultSet,然后迭代它,就像这样(不介意表和字段的名称,查询相当简单;结果是一行包含一列,因为{{1子句):

LIMIT 1

并且此ResultSet已关闭错误。似乎Groovy优化资源并立即关闭def resultSet = sql.executeQuery("SELECT age FROM person WHERE id = 12345 LIMIT 1") resultSet.next() 。我没有查看Groovy SDK的源代码。我发现eachRow和其他带闭包式处理程序的方法工作正常,并且不抛出此ResultSet已关闭错误。

也许,封闭式处理程序的方法可以帮助您。例如,请查看the article where rows() method with closure is used

除外
ResultSet