【问题标题】:How to prevent a ResultSet from being invalidated on Connection close?如何防止 ResultSet 在连接关闭时失效?
【发布时间】:2010-10-24 20:44:00
【问题描述】:

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

但是 ResultSet 会在其父 Connection 关闭并抛出时立即失效

java.sql.SQLException: Operation not allowed after ResultSet closed

如何避免这种情况?

【问题讨论】:

    标签: java scala jdbc database-connection resultset


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你想彻底改变你的想法!

      创建一个对 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)
      

      【讨论】:

        【解决方案4】:

        结果集不是这样工作的。它本身并不存储数据,它只是充当它的接口。

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

        【讨论】:

          猜你喜欢
          • 2014-05-09
          • 2017-04-05
          • 1970-01-01
          • 2018-02-06
          • 1970-01-01
          • 2016-03-04
          • 2017-09-03
          • 1970-01-01
          • 2010-11-21
          相关资源
          最近更新 更多