【问题标题】:ORMLite ForeignCollection: Must use ClosableIterator?ORMLite ForeignCollection:必须使用 ClosableIterator?
【发布时间】:2011-10-27 00:20:30
【问题描述】:
关于使用 ORMLite 的快速问题。我试图确保我的实现是正确的。有一部分文档讨论了 closableIterators 以及如何访问它来加载 LazyForeignCollection 类,并且需要关闭(或读取到最后)才能关闭数据库连接:
注意:与 Dao.iterator() 方法一样,惰性集合返回的迭代器在完成后必须关闭,因为下面有一个到数据库的连接。如果您一直通过迭代器或调用 close() ,则会发生关闭。只有 ForeignCollection 返回一个可关闭的迭代器。
所以我的问题很简单:只能通过 closableIterator 访问集合吗?我是否可以像使用任何其他 Java 集合一样使用 Collection / ForeignCollection 对象,而不必担心数据库连接问题(例如:foreach 循环)?
【问题讨论】:
标签:
java
android
dao
ormlite
foreign-collection
【解决方案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();
}