【问题标题】:CachedRowSet: can it still be used to hold ResultSet data?CachedRowSet:还能用来保存ResultSet数据吗?
【发布时间】:2012-04-26 21:37:29
【问题描述】:

我想编写一个 java 函数,它接受一个 SQL 查询并返回一个 ResultSet 以便在其他地方处理。这不能完成,因为一旦连接关闭,ResultSet 就死了。

谷歌搜索我发现了一个VERY OLD (2004) OReilly article,它有一些看起来像治愈的东西:CachedRowSet。您只需放入 ResultSet,CachedRowSet 保存数据,让您关闭连接并使用返回的 CachedRowSet 在别处播放数据。

这篇文章引用了 Sun 的 CachedRowSet 实现,但似乎无处可寻。

现代 javadocs(适用于 Java 1.5 及更高版本)似乎有同名的“CachedRowSet”,它不仅仅是 ResultSet 数据的持有者。 “CachedRowSet”似乎完成了从获取连接和其他所有事情的整个数据库处理。

那个“CachedRowSet”是不是和老文章里讲的一样?

我想要一些简单的东西,就像旧文章中的一样。在连接关闭后将 ResultSet 放入其中进行处理。

有这样的动物吗?

谢谢

【问题讨论】:

    标签: java resultset cachedrowset


    【解决方案1】:

    CachedRowSet 是标准的 Java 接口。 Sun 编写了一个参考实现,以及Sun/Oracle JDK contains it。如果您使用的是不同的 JDK,则该实现或其他实现可能可用也可能不可用。

    如果您已经有一个ResultSet,那么您可以使用populate 方法从中填充一个CachedRowSet

    如果您有足够的前瞻性来使用 Java 7,那么您可以使用具有createCachedRowSet 方法的RowSetFactory 以可移植的方式获取CachedRowSet 实例。您可以从RowSetProvider 获得RowSetFactory(当然!)。

    【讨论】:

      【解决方案2】:

      javax.sql.rowset.CachedRowSet 只是一个接口。有一个 Sun/Oracle 专有实现,但不受支持,因此使用起来有风险。

      如今大多数代码都遵循“转换为 pojos”模型。

      【讨论】:

      • MBFG;我正在使用 Oracle,我希望在清理一些遗留代码并学习更好的数据处理方法(数据库框架等)时将其用作临时措施。我找不到任何关于在哪里获得它,如何使用它的信息。除了更多谷歌搜索之外还有什么线索吗?
      • 如何使用 pojos 代替获取“ResultSet”以在获得它的函数之外滚动?
      • 是什么让您认为 com.sun.rowset.CachedRowSetImpl 不受支持? CachedRowSet interface 在 Java 7 中,其 javadoc 声明“Oracle Corporation 提供的 CachedRowSet 接口的参考实现是标准实现。开发人员可以按原样使用此实现”。参考实现是com.sun.rowset.CachedRowSetImpl;这听起来对我来说并不支持。
      • @tom 但是,如果您尝试使用该实现类进行编译,则会出现以下警告:“CachedRowSetImpl 是内部专有 API,可能会在将来的版本中删除”。我认为正确的方法是您上面概述的方法,使用 RowSet 的工厂/提供者。
      • @PaoloC:使用提供者和工厂似乎更可取。我怀疑您收到的警告是您的编译器适用于所有 com.sun.* 导入的全面警告。我仍然认为 javadoc 暗示它实际上不是内部专有 API。但是,是的,因为现在每个人都在使用 Java 7+,所以使用提供程序!
      【解决方案3】:

      如果您只想传输数据而不需要 CachedRowSet 提供的所有功能,那么最好将结果集数据放在 List of Lists 中。

         List<Object> list = new ArrayList<Object>();
         ResultSet rs = stmt.executeQuery("select * from myTable");
         while(rs.next()) {
               List<Object> row = new ArrayList<Object>();
               row.add(rs.getObject(1));
               row.add(rs.getObject(2));
               row.add(rs.getObject(3));
               //And so on, or you can use the ResultSetMetaData to determine the number of columns
               list.add(row);
         }
         rs.close();
      

      完成后,您可以将该列表对象发送到您想要的任何地方,然后遍历它以获取数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多