ORMLite ForeignCollection:必须使用ClosableIterator吗?

时间:2011-08-15 01:07:12

标签: java android dao ormlite foreign-collection

关于使用ORMLite的快速提问。我正在努力确保我的实施是正确的。有一部分文档讨论了closableIterators以及如何访问它加载了LazyForeignCollection类,需要关闭(或读到最后)才能关闭数据库连接:

  

注意:与Dao.iterator()方法一样,延迟集合返回的迭代器必须在完成后关闭,因为下面的数据库有一个连接。如果你通过迭代器一直走,或者你在它上面调用close(),就会发生关闭。只有ForeignCollection返回一个可关闭的迭代器。

所以我的问题很简单:只能通过closableIterator访问集合吗?我可以像使用任何其他Java集合一样使用Collection / ForeignCollection对象而不用担心数据库连接的东西(例如:foreach循环)吗?

1 个答案:

答案 0 :(得分:6)

我认为文档足以解释这一点。问题是当您完成连接时需要关闭,否则与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();
}

你也可以使用“wrapped iterable”,它允许你在for循环中使用for循环。

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