ORMLite ForeignCollection: нужно ли использовать ClosableIterator? - PullRequest
3 голосов
/ 15 августа 2011

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

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

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

1 Ответ

6 голосов
/ 16 августа 2011

Я думал, что документации будет достаточно, чтобы объяснить это. Проблема в том, что соединение должно быть закрыто, когда вы закончите, иначе соединение с базой данных 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();
}
...