Java 当原始结果集从方法返回到新对象时,它会发生什么变化?

Java 当原始结果集从方法返回到新对象时,它会发生什么变化?,java,jdbc,return,resultset,Java,Jdbc,Return,Resultset,伪代码可以更好的解释我自己。我现在正在学习Java 如果我有办法 public resultSet getEverything() { resultSet rs = blabla; return rs } 我无法rs.close(),因为我需要在检索它的方法中使用它 因此,我将使用它,并可能“关闭”我创建的新结果集 上一个结果集会发生什么? 是否由垃圾收集器收集? 当我关闭“新”结果集时,它会自动关闭吗? 它是否对代码效率/性能有任何影响 任何反馈都将不胜感激:

伪代码可以更好的解释我自己。我现在正在学习Java

如果我有办法

public resultSet getEverything() 
{    
   resultSet rs = blabla;    
   return rs 
}
我无法
rs.close()
,因为我需要在检索它的方法中使用它 因此,我将使用它,并可能“关闭”我创建的新结果集

上一个结果集会发生什么? 是否由垃圾收集器收集? 当我关闭“新”结果集时,它会自动关闭吗? 它是否对代码效率/性能有任何影响

任何反馈都将不胜感激:)因为这让我有点困惑。我认为这更像是一个面向对象的问题,而不是Java。
谢谢

您不应该从方法返回java.sql.ResultSet。它应该始终被创建,映射到对象或数据结构中,并在finally块中创建它的方法的范围内关闭

java.sql.ResultSet与数据库游标(一种稀缺资源)相关联。你不想让它们开很长时间

垃圾收集器不会清理结果集、语句或到数据库的连接。它将从内存中删除引用,但游标或连接仍将在数据库端打开。你有责任妥善关闭它们,否则你会耗尽供应


对象、数据结构或CachedRowSet是正确的返回对象。

这里只有一个结果集。您创建它并在此方法中返回它;调用方法(调用
getEverything()
)现在有了它——它没有副本,或者类似的东西;它具有您在此方法中创建的结果集。但是如果要关闭它,调用方法必须分配
getEverything()
的结果,如下所示:

resultSet rs = getEverything();
getEverything();
而不是像这样简单地调用方法:

resultSet rs = getEverything();
getEverything();

在第二种情况下,将创建结果集,然后将其提供给后台垃圾回收器(基本上是删除的),而无需关闭它。

谢谢。。你说得很清楚:)另一方面,这也很有趣,达菲莫在他的回答中指出。。。如果用相同的方法关闭与DB的任何连接,效果会更好。