Java 如何在SQL包装类中返回ResultSet

Java 如何在SQL包装类中返回ResultSet,java,mysql,Java,Mysql,因此,我正在用Java创建一个简单的MySQL包装类,只是为了我个人的易用性,尽管我有一个问题 在Java中的每个MySQL示例中,关闭结果集,然后是语句,然后是连接。此操作的顺序是否重要?如果不重要,是否必须关闭ResultSet 我想返回结果集,但是如果我不能这样做,我必须找到其他方法来返回查询结果。最好按照资源打开的相反顺序关闭资源。Javadoc说(部分) 注意:关闭语句对象时,其当前的结果集对象(如果存在)也将关闭 与返回ResultSet不同,通常实现并返回ValueObject类型

因此,我正在用Java创建一个简单的MySQL包装类,只是为了我个人的易用性,尽管我有一个问题

在Java中的每个MySQL示例中,关闭
结果集
,然后是
语句
,然后是
连接
。此操作的顺序是否重要?如果不重要,是否必须关闭
ResultSet


我想返回结果集,但是如果我不能这样做,我必须找到其他方法来返回查询结果。

最好按照资源打开的相反顺序关闭资源。Javadoc说(部分)

注意:关闭
语句
对象时,其当前的
结果集
对象(如果存在)也将关闭

与返回
ResultSet
不同,通常实现并返回
ValueObject
类型的
集合。这通常是一个普通的旧Java对象(或POJO)、JavaBean或数据传输对象(DTO)

秩序重要吗

是的,一般来说,按相反顺序关闭资源是一种好的做法。同样在Java7TrywithResources中,顺序是相反的,即最后打开的资源首先关闭

是否将结果集传递给其他组件

您可以使用它,它是一个与数据源断开连接的结果集,可以安全地传递给其他组件

引用Oracle javadocs:

CachedRowSet
对象是断开连接的行集,这意味着 仅短暂地使用到其数据源的连接。它连接 在读取数据以填充其自身时,将其复制到其数据源 当它将更改传播回其底层时,会重复执行行 数据源。其余时间,将创建一个
CachedRowSet
对象 已断开连接,包括在修改其数据时。存在 断开连接会使行集对象更精简,因此 更容易传递到另一个组件。例如,断开连接的
行集
对象可以序列化并通过线路传递给精简 客户端,如个人数字助理(PDA)

编辑:

基于@JoD的评论。在选择任何选项之前,应该考虑数据大小和所要解决的问题。


如果您正在处理一个查询,可能作为ETL作业的一部分,那么需要 要处理4GB内存,您真的想要4GB吗 在开始任何进一步处理之前,是否完全在内存中? CachedRowSet在特定情况下非常好,而且绝对是 这里值得一提。但是我们应该适当地考虑这一点。 上下文


考虑到您按顺序创建它们(
连接
语句
结果集
),无序关闭它们实际上可能会阻止它们释放在服务器上创建的资源。按照惯例,它们往往是按相反的顺序关闭的。另外,您可能需要创建一个新的
语句
结果集
,这样您就不想无序地关闭它们。你可能还想看看,这让生活变得轻松多了;)从java 7开始,使用try with resource,无需担心数据集有多大?您是否正在尝试检索10条记录?也许有数百万张唱片?选择一个合适的答案会有很大的不同@乔德。此时,可能不超过几百个。我真诚地不同意“实现ValueObject并返回ValueObject类型的集合是很常见的”这句话。
ResultSet
是数据的非常好的表示形式,而不必将整个结果实际存储在内存中。它允许在遍历时进行处理。在处理非常大的数据集时,这一点非常重要。我认为处理ResultSet是一个很好的做法,只要您将连接保持在作用域内。如果您正在处理一个需要处理4GB内存的查询(可能是ETL作业的一部分),您真的希望在开始任何进一步处理之前,将4GB内存完全存储在内存中吗
CachedRowSet
在特定情况下非常好,这里绝对值得一提。但我们应该在适当的背景下(OP没有充分草拟)考虑这一点。好的加法。我完全同意你的看法。但由于OP没有提供这些细节,我想我应该提一下。我会编辑这篇文章来包含这一点。谢谢