Java ResultSet работает с postgresql - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть таблица в моей базе данных, где она содержит 2 столбца: uid1 - чей-то идентификатор, uid2 - его друг.

Я хочу создать список, где я чей-то друг - до 5 глубины соединения.

Итак, я построил следующий рекурсивный метод:

    private void recursive(int theUid,ResultSet rs,ArrayList<Integer> friends,int count,int next,PreparedStatement pstmt) throws SQLException{
        if(count>=1 && next==theUid){
            return;
        }
        else if(count>=DEPTH_OF_CONNECTION){
            return;
        }

        else{
            pstmt.setInt(1,next);
            rs=pstmt.executeQuery();
            count++;
            while(rs.next()) {
                friends.add(rs.getInt(1));
                recursive(theUid,rs,friends,count,rs.getInt(1),pstmt);
            }
        }
    }
}

И я получил следующую ошибку:

Исключение в потоке "main" org.postgresql.util.PSQLException: Этот ResultSet закрыт.в org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkClosed (AbstractJdbc2ResultSet.java:2654) в org.postgresql.jdbc2.AbstractJdbc2ResultSet.next (AbstractJd *1010* 1014) может помочь вам в поискепроблема?

Ответы [ 2 ]

9 голосов
/ 12 декабря 2011

Javadoc для оператора jdbc:

По умолчанию только один объект ResultSet на объект объекта может быть открыт одновременно.

Поэтому я предполагаю, что вы пытаетесь открыть слишком много наборов результатов для одного и того же PreparedStatement одновременно.

edit:

Postgres jdbc driver doc , кажется, подтверждает это:

Вы можете использовать один экземпляр Statement столько раз, сколько захотите.Вы можете создать его, как только откроете соединение и использовать его в течение всего срока жизни соединения.Но вы должны помнить, что только один ResultSet может существовать для каждого оператора или PreparedStatement в данный момент времени.

1 голос
/ 12 декабря 2011

Из того, что я могу сказать, вы используете объект ResultSet для хранения результатов вашего оператора, а затем передаете его в качестве параметра в рекурсивный вызов функции.Таким образом, в основном вы перезаписываете переменную и теряете ссылку на нее.Вы должны либо написать оператор sql для получения необходимых данных, либо не передавать тот же объект ResultSet в рекурсивный вызов.

...