如何在SQL Wrapper类中返回ResultSet

时间:2015-06-25 04:12:39

标签: java mysql

所以我在Java中创建一个简单的MySQL包装器类只是为了个人易用性,尽管我有一个问题。

在Java的每个MySQL示例中,ResultSet都关闭,然后是Statement,然后是Connection。这个顺序是否重要,如果不是,ResultSet是否必须关闭?

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

2 个答案:

答案 0 :(得分:2)

  

订单重要吗?

通常,以相反顺序关闭资源是一种好习惯。同样在Java 7 try-with-resources中,顺序是反向的,即最后打开的资源首先关闭。

  

将结果集传递给其他组件?

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

引用Oracle javadocs:

  

CachedRowSet对象是断开连接的行集,这意味着它   仅短暂地使用与其数据源的连接。它连接起来   当它正在读取数据以填充自身时,它的数据源   在将更改传播回其底层时再次执行行   数据源。剩下的时间,CachedRowSet对象是   断开连接,包括在修改其数据时。存在   disconnected使得RowSet对象更加精简,因此更多   更容易传递给另一个组件。例如,断开连接   RowSet对象可以被序列化并通过线路传递给瘦   客户,如个人数字助理(PDA)。

修改

根据@JoD的评论。在选择任何选项之前,您应该考虑数据大小和您尝试解决的问题。

  

如果您正在处理查询,可能需要作为ETL作业的一部分   处理4 GB的内存,你真的想拥有4GB的内存吗?   在开始任何进一步处理之前完全在内存中?   在某些情况下,CachedRowSet非常好,绝对是   值得一提的是这里。但我们应该考虑到这一点   上下文

答案 1 :(得分:1)

close资源的良好做法与其打开顺序相反。 Statement.close() Javadoc说(部分)

  

注意:当Statement对象关闭时,其当前的ResultSet对象(如果存在)也会关闭。

而不是返回ResultSet,通常会实现ValueObject并返回Collection类型的ValueObject。这通常是普通旧Java对象(或POJO),JavaBean或数据传输对象(DTO)。