ORMLite ForeignCollection: нужно использовать ClosableIterator?

быстрый вопрос об использовании ORMLite. Я пытаюсь убедиться, что моя реализация правильная. В документации есть часть, в которой говорится о closableIterators и о том, как доступ к этому загружает класс LazyForeignCollection, и его необходимо закрыть (или прочитать до конца), чтобы соединение с базой данных было закрыто:

ПРИМЕЧАНИЕ. Как и в случае с методом Dao.iterator(), итератор, возвращаемый отложенной коллекцией, должен быть закрыт, когда вы закончите с ним, потому что под ним открыто соединение с базой данных. Закрытие происходит либо в том случае, если вы проходите весь путь через итератор, либо если вы вызываете для него функцию close(). Только ForeignCollection возвращает закрывающийся итератор.

Итак, мой вопрос прост: можно ли получить доступ к коллекции только через closableIterator? Могу ли я просто использовать объект Collection/ForeignCollection, как и любую другую коллекцию Java, и не беспокоиться о соединении с базой данных (например, цикл foreach)?


person dineth    schedule 15.08.2011    source источник


Ответы (1)


Я думал, что документации будет достаточно, чтобы объяснить это. Проблема в том, что соединение должно быть закрыто, когда вы закончите, иначе соединение с базой данных SQL останется открытым. Если вы используете шаблон типа for (Account account : accountDao), то соединение будет только закрыто, если вы пройдете полностью таблицу. Если вы используете оператор break или другой оператор (return, goto, exception и т. д.), чтобы выйти из цикла в середине, то ORMLite не закроет соединение автоматически.

Если вы собираетесь выйти из цикла, правильный шаблон для использования указан в документах. http://ormlite.com/docs/iterator

CloseableIterator<Account> iterator = accountDao.closeableIterator();
try {
    while (iterator.hasNext()) {
        Account account = iterator.next();
        ...
    }
} finally {
    iterator.close();
}

Вы также можете использовать «обернутую итерацию», которая позволяет вам закрывать в цикле finally for.

CloseableWrappedIterable<Account> wrappedIterable =
    accountDao.getWrappedIterable();
try {
    for (Account account : wrappedIterable) {
        ...
    }
} finally {
    wrappedIterable.close();
}
person Gray    schedule 16.08.2011