所以我在Java中创建一个简单的MySQL包装器类只是为了个人易用性,尽管我有一个问题。
在Java的每个MySQL示例中,ResultSet
都关闭,然后是Statement
,然后是Connection
。这个顺序是否重要,如果不是,ResultSet
是否必须关闭?
我想返回ResultSet,但如果我不能这样做,我必须找到一些其他方法来返回查询的结果。
答案 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)。