0

伪代码来更好地解释我的自我。我现在正在学习Java。

如果我有方法

public resultSet getEverything() 
{    
   resultSet rs = blabla;    
   return rs 
}

我不能rs.close(),因为我需要在检索它的方法中使用它,因此我将使用它,并且可能“关闭”我创建的新结果集。

之前的结果集会发生什么?是否留给垃圾收集器收集?当我关闭“新”结果集时它会自行关闭吗?它对代码效率/性能有什么影响吗?

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

4

2 回答 2

1

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

java.sql.ResultSet 与数据库游标相关联,这是一种稀缺资源。你不想让那些打开很长时间。

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

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

于 2010-02-13T15:56:19.027 回答
0

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

resultSet rs = getEverything();

而不是像这样简单地调用方法:

getEverything();

在第二种情况下,将创建结果集,然后在没有机会关闭它的情况下提供给幕后垃圾收集器(本质上是删除)。

于 2010-02-13T15:56:28.577 回答