3

質問:一度に 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 を使用しています。詳細な返信ありがとうございます。

4

2 に答える 2

0
  1. エンティティを読み取り専用として読み込みます。

    HQLの場合

    Query.setReadOnly( true );
    

    基準について

    Criteria.setReadOnly( true );
    

    http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/readonly.html#readonly-api-querycriteria

    State-Session とはかなり異なるステートレス セッション。

    ステートレス セッションを使用して実行される操作は、関連付けられたインスタンスにカスケードされることはありません。コレクションはステートレス セッションによって無視されます

    http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html#batch-statelesssession

  2. flash() および clear() を使用して、セッション キャッシュをクリーンアップします。

    session.flush();

    session.clear();

    Hibernate session.flush() に関する質問

  3. ScrollableResults は期待どおりに動作するはずです。

    ロードした各アイテムは、エビクトまたはクリアして実際に正常に動作することを確認する必要がない限り、メモリ スペースを消費することを忘れないでください。

    Mysql J/Connecotr の ScrollableResults は偽物として動作し、行全体をロードしますが、Oracle コネクタは正常に動作すると思います。

    Hibernate の ScrollableResults を使用して 9,000 万件のレコードをゆっくりと読み取る

    代替案が見つかった場合は、この方法を使用することを検討してください。

    1. Select PrimaryKey of every rows that you will process 
    2. Chopping them into PK chunk
    3. iterate -
       select rows by PK chunk (using in-query) 
       process them what you want
    
于 2013-03-15T04:24:35.067 に答える