关于使用ORMLite的快速提问。我正在努力确保我的实施是正确的。有一部分文档讨论了closableIterators以及如何访问它加载了LazyForeignCollection类,需要关闭(或读到最后)才能关闭数据库连接:
注意:与Dao.iterator()方法一样,延迟集合返回的迭代器必须在完成后关闭,因为下面的数据库有一个连接。如果你通过迭代器一直走,或者你在它上面调用close(),就会发生关闭。只有ForeignCollection返回一个可关闭的迭代器。
所以我的问题很简单:只能通过closableIterator访问集合吗?我可以像使用任何其他Java集合一样使用Collection / ForeignCollection对象而不用担心数据库连接的东西(例如:foreach循环)吗?
答案 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();
}