ResultSet сбрасывается при использовании рекурсии - PullRequest
4 голосов
/ 02 марта 2012

У меня есть вопрос относительно ResultSet объектов в Java и рекурсии.

Я работал над некоторым кодом для университета, и всякий раз, когда я находил потомка, я возвращался к этому новому узлу, но когда я выходил из рекурсии и пытался rs.next (), указатель уходил от указания на строку 1 назад в строку 0, и когда он достиг строки 0, произошел сбой rs.next (), и он вернулся! Я знал, что там была одна вещь, которую она еще не читала! Что вызывает это?

Единственный способ обойти эту проблему - пройти набор результатов, получить каждый элемент и добавить его в список массивов, а затем перебрать массив, выполняя рекурсию для каждого элемента массива! Конечно, это должно быть лучший способ обойти это?

Это новый код, который я использую

private Vector<String> getDescendents(String dogname, Vector<String> anc) {
    if (anc == null) anc = new Vector<String>();
    ArrayList<String> tempList = new ArrayList<String>(2);
    try {
        System.out.println("Inside ");
        childStmt.setString(1,dogname);
        childStmt.setString(2,dogname);
        ResultSet rs = childStmt.executeQuery();
        System.out.println("Before while "+rs.getRow());
        while (rs.next()){
            String col1 = rs.getString(1);
            tempList.add(col1);
            anc.add(col1);
        } 
        for (String s:tempList){
            getDescendents(s,anc);
        }

    }
    catch(Exception e) {
        doError(e, "Failed to execute ancestor query in getBreeding");
    }
    return anc;
}

Однако до этого у меня был вызов getDescendents внутри цикла while и, следовательно, нет цикла for и нет никакого arraylist, но всякий раз, когда он действительно рекурсивен, он теряет отслеживание набора результатов, когда он возвращается из рекурсии.

Более подробная информация: Когда я использовал отладчик (почти сказал, что GDB там слишком много C), идентификатор набора результатов был таким же, но указатель строки вернулся к 0, и вызов rs.next не удался!

Еще раз приветствуется любое объяснение!

p.s ранее это выглядело как

private Vector<String> getDescendents(String dogname, Vector<String> anc) {
    if (anc == null) anc = new Vector<String>();
    ArrayList<String> tempList = new ArrayList<String>(2);
    try {
        System.out.println("Inside ");
        childStmt.setString(1,dogname);
        childStmt.setString(2,dogname);
        ResultSet rs = childStmt.executeQuery();
        System.out.println("Before while "+rs.getRow());
        while (rs.next()){
            String col1 = rs.getString(1);
            anc.add(col1);
            getDescendendts(col1,anc);
        } 

    }
    catch(Exception e) {
        doError(e, "Failed to execute ancestor query in getBreeding");
    }
    return anc;
}

1 Ответ

12 голосов
/ 02 марта 2012

Похоже, вы повторно используете childStmt; не делай этого Из Statement Javadoc :

По умолчанию может быть открыт только один объект ResultSet для каждого объекта Statement в то же время. Следовательно, если чтение одного объекта ResultSet чередуется с чтением другого, каждый должен быть сгенерирован разными объектами Statement. Все методы выполнения в заявлении интерфейс неявно закрывает текущий объект ResultSet статута, если открытый существует.

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

...