2017-01-11 3 views
0

以下のコードは意図したとおりに動作していますが、より良い方法がありますか?次の間にDBを操作すると、ページはどのように機能するのですか?

私はキューのようなDBを消費しており、最大数のバッチで処理しています。私はそれが私がDBは、ページを取得し、次のページを取得する間に操作された場合に何が起こるかで何か良いチュートリアル/ドキュメントを見つけることができませんしかし

page.hasNext()page.nextPageable()を使用するようにリファクタリングすることができますどのように考えています。

List<Customer> toBeProcessedList = customerToBeProcessedRepo 
      .findFirstXAsCustomer(new PageRequest(0, MAX_NR_TO_PROCESS)); 
while (!toBeProcessedList.isEmpty()) { 
    //do something with each customer and 
    //remove customer, and it's duplicates from the customersToBeProcessed 
    toBeProcessedList = customerToBeProcessedRepo 
       .findFirstXAsCustomer(new PageRequest(0, MAX_NR_TO_PROCESS)); 
} 

答えて

1

あなたは各ページのページングのサポートが実行されます、新しいSQL文を要求し、そしてあなたは空想(そしておそらく愚かな)何かをしない場合に使用している場合、それらは別のトランザクションで実行されます。これにより、ユーザーがページ間を移動するときに、要素を複数回取得するか、まったく表示しないことがあります。

例:ページサイズ3;開始する要素:A、B、C、D、E、F

ユーザーが最初のページを開き、

A、Bを見て、C Xが取得

要素(ページの総数は2です) Bの後に挿入されます。ユーザが次のページに移動し、代わりにXを追加する、Cが削除される場合

C、D、Eは、(ページの総数は今3)

は、2ページが表示され見る

E 、F

Dが最初のページに移動するためです。理論的には

(基礎となるデータベースでサポートされている場合)1は、その1は、一貫性のあるページを取得する読み取り安定性と実行時間の長いトランザクションを持つことができますが、これは以下のような質問を開きます:

  • このトランザクションの終了を行い

    、ユーザーは新しい/変更されたデータを見ることができます

  • このトランザクションはいつ終了しますか?実際の利益だから99 100の例では、デフォルトのアプローチはかなり合理的である、全く

明らかではないが

  • このアプローチは、いくつかのかなり高いリソースコストを持っているでしょう。

    脚注:私は多少のリレーショナルデータベースを想定していますが、他のストアは基本的に同じように動作するはずです。

  • +0

    ページ1を読んだらABCを取得し、Cを取り除くとページ2を読むときにCDEを取得するか、Eのみを取得します(dがページ1に移動したため)。 –

    +0

    @ViktorMellgrenはそれに答えるための例の変形を加えました。 –

    +0

    おかげで、それは私がそれがうまくいくと思ったのですが、良い例は見つかりませんでした。ありがとうございました! –

    関連する問題