将新的Java Resultset对象分配给现有对象,然后关闭原始ResultSet对象会导致新创建的对象被关闭?

时间:2014-02-10 09:35:19

标签: java object jdbc resultset

所有

对于名为Analyze的类及其构造函数Analyze,它将Java JDBC Resultset对象作为参数。

private Resultset analysisSet

public void Analyse(ResultSet queryResults)
{
    analysisSet = queryResults;
    queryResults.close();
}

public void doSomeStuff()
{
    analysisSet.next() //throws SQL Exception "Closed Resultset : next"
}

但是,如果我注释掉“queryResults.close()”语句,那么它可以正常工作吗?

当我将一个物体分配给另一个物体时,它们彼此互相排斥?

如果有人能解释这里发生的事情。

3 个答案:

答案 0 :(得分:3)

Java中的对象赋值是引用,而不是值。在简单的情况下

int [] a = new int[] { 17 };
int [] b = a;

b[0] = 11;
// a[0] is 11 now.

结果集相同。当您将其分配给新变量时,不要克隆它。它只是一个不同的参考对象。

无法轻松克隆ResultSet,一般情况下,保持打开一段时间并将其分配给对象字段并不是最佳做法。最好将数据复制到您自己的数据结构并尽快关闭ResultSet。

答案 1 :(得分:1)

这两个引用指向相同的结果集对象。

当你关闭一个时,你也会关闭另一个 最好是说当你在其中一个参考上打电话时, 这会关闭结果集对象。所以另一个参考是指向 到同一个(现在关闭的)结果集对象。

这发生在这里。

答案 2 :(得分:1)

在Java中,您正在处理引用。我总是认为它们就像指针一样,所以当你执行analysisSet = queryResults;时,你的代码中没有复制对象,只是添加了另一个引用。所以你有一个ResultSet,有2个引用它。如果关闭此结果集(使用其中一个引用),则在两者都访问时它将关闭。