【问题标题】:multiple use of the same ResultSet in Java在 Java 中多次使用相同的 ResultSet
【发布时间】:2013-07-05 08:44:36
【问题描述】:

在 Java 中使用相同的 ResultSet 对象是不是坏习惯?为什么或者为什么不? //这里似乎是我唯一的选择,因为我试图查询一个表的记录数,然后查询该表的视图;我不知道如何改变视图。

换句话说,就是

ResultSet myResultSet = statement.executeQuery("SELECT count(*) FROM table");
myResultSet.next();
int recordCount = myResultSet.getInt(1);
myResultSet = statement.executeQuery("SELECT * FROM tableView");
//set other variables based on contents of fetched view

一个坏主意?

【问题讨论】:

  • 视情况而定。请发布源代码示例。我之所以问,是因为我相信您可能会使用不同的 ResultSet 对象而没有意识到这一点。这也可能与codereview.stackexchange.com 更相关
  • 这完全取决于您的要求,当您的使用完美时,这根本不是一个坏习惯
  • 我的用法(在示例中显示)“完美”吗?我在您发布此评论后立即添加了它;对不起,我应该预料到反应并立即这样做的。

标签: java derby


【解决方案1】:

在Java中使用同一个ResultSet对象是不是坏习惯?

我会说这取决于特定的要求和编码方式。

我相信您正在寻找的是一个可滚动的ResultSet,它是作为 2.0/2.1 版(集成到 JDK 1.2) 中的一项新的改进功能引入的,它有两种风格: TYPE_SCROLL_INSENSITIVE 和 TYPE_SCROLL_SENSITIVE。

如果我们看到您发布的代码:

ResultSet myResultSet = statement.executeQuery("SELECT count(*) FROM table");
myResultSet.next();
int recordCount = myResultSet.getInt(1);
myResultSet = statement.executeQuery("SELECT * FROM tableView");

您基本上所做的是将myResultSet 引用变量设置为新的ResultSet 对象。我看不出有什么不好的地方,也许比我更开明的人能指出来。

【讨论】:

    【解决方案2】:

    您发布的代码不会“重用相同的ResultSet”,它只是丢弃了一个ResultSet 对象,然后使用相同的变量来保存对第二个executeQuery 创建的不同ResultSet 的引用.在用第二个结果集覆盖引用之前,在第一个结果集上调用 close() 是一种很好的编码习惯,但这并不是绝对必要的,因为

    ResultSet 对象在生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时自动关闭。 p>

    (来自ResultSet JavaDoc documentation,我的粗体字)

    【讨论】:

    • 非常感谢;我试图在那里寻找相同类型的响应。 //对于我们大多数人来说,多线程是非常困难的......
    【解决方案3】:

    完成表格后,您可以关闭相应的结果集。并且相同的引用可以用于另一个表。

    如果要同时查询表和视图,则需要两个单独的结果集。

    【讨论】:

    • 我尝试过类似SELECT count(*) FROM table CROSS JOIN (SELECT * FROM view) 的方法,根据 Derby 参考手册,它应该返回一个包含 n+1 列的单行表,其中 n 是其中的列数-行视图。 (文档指出A CROSS JOIN is a JOIN operation that produces the Cartesian product of two tables. )
    • 在这种特殊情况下,您可以通过调用prepared statement的executeQuery()方法用单个结果集迭代结果。
    • 出于某种原因,通过将该字符串用作statement.executeQuery() 的参数(不是准备好的语句),我在结尾处遇到一些语法错误,说它最后遇到了
    • 在那之前我有Statement statement = connection.createStatement();。我不知道发布我的所有示例代码(我认为这就是你的意思),即使我将它用作示例代码。
    • 我想,你的代码应该是这样的: Statement statement = connection.createStatement();结果集 rs = statement.executeQuery(String sql);你能粘贴你得到的异常的完整堆栈吗?
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多