質問:一度に 1000 件のレコードのバッチを処理 (読み込み) し、現在の 1000 件のレコードのバッチだけがメモリにあることを確認するにはどうすればよいですか? 主キーが ' ID
' で、テーブルが であると仮定しますCustomer
。
背景:これはユーザーのページネーションではなく、テーブルに関する統計をコンパイルするためのものです。使用できるメモリが限られているため、一度に 1000 レコードのバッチでレコードを読み取りたいと考えています。私は記録を読んでいるだけで、記録は変更されません。はこの種のことに適していると読んだことStatelessSession
があり、 を使用している人について聞いたことがありScrollableResults
ます。
私が試したこと:setFirstResult
現在、私は Iterable を実装し、基本的にandを使用してページネーションを行ったカスタムメイドのソリューションに取り組んでいsetMaxResults
ます。これは私にとっては非常に遅いようですが、一度に 1000 レコードを取得できます。おそらく次のようなものを使用して、これをより効率的に行う方法を知りたいですScrollableResults
。現在の方法がなぜこんなに遅いのかはまだわかりません。ID で注文していますが、ID が主キーであるため、テーブルには既にそのようにインデックスが付けられているはずです。
お分かりかもしれませんが、私はこれを行う方法について少しずつ読み続けています。誰かがこれを行うための完全な方法を私に提供できれば、それは大歓迎です。設定する必要がFORWARD_ONLY
ありScrollableResults
、呼び出しevict(entity)
によってエンティティがメモリから取り出されることは知っています (第 2 レベルのキャッシュを行っている場合を除きます。キャッシュを使用しているかどうかを確認する方法はまだわかりません)。ただし、JavaDoc には、たとえば一度に 1000 レコードを読み取るメソッドがありません。利用可能なメモリ不足と遅いネットワーク パフォーマンスとのバランスが必要なので、ネットワーク経由でレコードを 1 つずつ送信するという選択肢はありません。可能な限り Criteria API を使用しています。詳細な返信ありがとうございます。