2014-02-10 1 views
0

Все,Назначение нового объекта Java Resultset для существующего, а затем закрытие исходного объекта ResultSet приводит к закрытию вновь созданного объекта?

Для класса под названием 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

Назначение объектов в Java по ссылке, а не по значению. В простом случае

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

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

То же самое для набора результатов. Когда вы просто назначаете его новой переменной, вы не клонируете ее. Это просто другая ссылка на тот же объект.

ResultSet не может быть легко клонирован и, как правило, не рекомендуется сохранять его в течение некоторого времени, назначенного для поля объекта. Лучше всего было бы скопировать данные в вашу собственную структуру данных и как можно скорее закрыть ResultSet.

+0

В C++ я мог бы выполнить полное присваивание, как это, без ссылки, как сделать копию> – kaleeway

+0

Вы можете изучить защищенный метод clone(), который просто копирует все поля, очень похожее на назначение структуры C. Но это не считается очень хорошим методом использования. – h22

+0

Не копируйте его, как только вы закончите использовать его, сначала вызовите(), чтобы сбросить его. Это странный случай использования. Зачем вам две ссылки на тот же ResultSet? –

1

Эти две ссылки указывают на один и тот же объект набора результатов.

Когда вы закрываете один, вы также закрываете другой.
Лучше сказать, что при вызове close на одной из ссылок
это закрывает объект набора результатов. Таким образом, другая ссылка указывает
тому же (теперь закрытому) объекту набора результатов.

Это происходит здесь.

1

В Java вы имеете дело со ссылками. Я всегда думаю о них как о указателях, поэтому в вашем коде, когда вы делаете analysisSet = queryResults;, вы не копируете объект, который вы просто добавляете к нему другую ссылку. Таким образом, у вас есть один ResultSet с 2 ссылками на него. Если вы закроете этот результирующий набор (используя одну из ссылок), тогда он закрывается при доступе к обоим.