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

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

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

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

1 ответ

Решение

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

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

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

Вы также можете использовать "обернутый итерируемый", который позволяет вам делать закрытие в циклах наконец с for.

CloseableWrappedIterable<Account> wrappedIterable =
    accountDao.getWrappedIterable();
try {
    for (Account account : wrappedIterable) {
        ...
    }
} finally {
    wrappedIterable.close();
}
Другие вопросы по тегам