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();
}