伪代码可以更好地解释我的自我。我现在正在学习Java。
如果我有方法
public resultSet getEverything()
{
resultSet rs = blabla;
return rs
}
我不能rs.close()
因为我需要在我检索它的方法中使用它
因此我会使用它,也许'关闭'我创建的新resultSet。
以前的resultSet会发生什么? 它是否被垃圾收集器收集? 当我关闭'new'resultSet时它会自动关闭吗? 它对代码效率/性能有任何影响吗?
任何反馈都会非常感激:)因为这让我有点困惑。它更像是一个OOP问题,而不是我认为的Java。 谢谢!
答案 0 :(得分:1)
您不应该从方法返回java.sql.ResultSet。应始终创建它,映射到对象或数据结构,并在finally块中创建它的方法范围内关闭。
java.sql.ResultSet与数据库游标(稀缺资源)相关联。你不想长时间保持开放状态。
垃圾收集器不会清除数据库的结果集,语句或连接。它将从内存中删除引用,但光标或连接仍将在数据库端打开。您有责任正确关闭它们,否则您将耗尽供应。
对象,数据结构或CachedRowSet是正确的返回方式。
答案 1 :(得分:0)
这里只有一个resultSet。您创建它并在此方法中返回它;调用方法(调用getEverything()
的方法)现在拥有它 - 它没有副本,或类似的东西;它具有您在此方法中创建的resultSet。但是调用方法必须分配getEverything()
的结果才能关闭它 - 如下所示:
resultSet rs = getEverything();
而不是简单地调用这样的方法:
getEverything();
在第二种情况下,将创建结果集,然后将其提供给幕后垃圾收集器(基本上,已删除),而无法关闭它。