3

ORMLite の使用に関する簡単な質問。実装が正しいことを確認しようとしています。closableIterators と、これにアクセスして LazyForeignCollection クラスをロードする方法について説明しているドキュメントの一部があり、データベース接続を閉じるには閉じる (または最後まで読み取る) 必要があります。

注: Dao.iterator() メソッドと同様に、レイジー コレクションによって返されたイテレータは、使用が終了したら閉じる必要があります。これは、その下のデータベースへの接続が開かれているためです。イテレータを最後まで通過するか、それに対して close() を呼び出すと、クローズが発生します。閉じることができる反復子を返すのは、ForeignCollection だけです。

だから私の質問は簡単です: コレクションは closableIterator を介してのみアクセスできますか? Collection / ForeignCollection オブジェクトを他の Java コレクションと同じように使用でき、データベース接続のことを気にする必要はありません (たとえば、foreach ループなど)。

4

1 に答える 1

6

これを説明するにはドキュメントで十分だと思いました。問題は、完了したら接続を閉じる必要があることです。そうしないと、SQL データベースへの接続が開いたままになります。for (Account account : accountDao)パターンのタイプを使用する場合、接続はテーブルを最後まで通過した場合にのみ閉じられます。またはその他のステートメント (return、goto、exception など) を使用して途中でループから抜けると、接続は ORMLite によって自動的に閉じられません。break

ループから抜け出す場合は、使用する適切なパターンがドキュメントで指定されています。 http://ormlite.com/docs/iterator

CloseableIterator<Account> iterator = accountDao.closeableIterator();
try {
    while (iterator.hasNext()) {
        Account account = iterator.next();
        ...
    }
} finally {
    iterator.close();
}

また、「ラップされた iterable」を使用することもできます。これにより、finally で for ループを閉じることができます。

CloseableWrappedIterable<Account> wrappedIterable =
    accountDao.getWrappedIterable();
try {
    for (Account account : wrappedIterable) {
        ...
    }
} finally {
    wrappedIterable.close();
}
于 2011-08-16T06:05:57.620 に答える