質問: iterableをチャンクする 私は `Iterable` を返すデータベースからオブジェクトのロードを取得するメソッドを持っています。 今のところ、私はデータベースから結果セットをロードし、そこからオブジェクトを構築し、それらのオブジェクトをコレクションに追加しています。 明らかに、私は、このメソッドを使用してロードできるデータの量と、Bad Things Happenを使い果たした場合には、メモリが制限されています。 実装を変更して、一度にすべてを取得するのではなく、データベースからデータをチャンクし、その結果のオブジェクトを `Iterable` インタフェースを介してクライアントに公開します。私のデータベースドライバはちょっとしたことができるので、私の最初の考えはこれを行う `Iterable` のカスタム実装です。 これは良いアプローチですか?ランタイムやライブラリで既にサポートされている可能性のあるものとして私を襲ってきます.ORMソリューションは関係ありません。
回答: 私は、私のアプリケーションの1つで、Joachimが提案したアプローチを実装しました。 `ResultSet` ラッパー実装の場合、 `ResultSet` メソッドを閉じた `destroy()`メソッドを含む `DestroyableIterator` /code> (一部のライブラリはこのインタフェースを提供していますが、私は3行のインタフェース定義のためにライブラリ依存性を導入する点は見当たりませんでした。) また、Iteratorの `next()`および`を使ってそれらを伝播するために、 `SQLException` をキャッチし、それらを(未チェック)Spring `DataAccessException` hasNext()`メソッドを使用します。 リソースを保持することに関するポイントは有効なものです。私は `DestroyableIterator` を使用してアプリケーションコードを制御していましたので、ライブの `ResultSet` を長時間保持することを避けるためにさまざまなタイムアウト機構がありました。