2017-09-20 12 views
1

私は、Spring Data JPAとSpring BatchでSpring Boot 1.5.7を使用しています。エンティティを読み取るのにJpaPagingItemReader<T>、エンティティを書き込むのにJpaItemWriter<T>を使用します。私がしようとしているのは、特定のデータベーステーブルからデータを読み取り、別のフォーマットに変換して別のテーブルに書き戻すことです(未処理のjson文字列をデシリアライズして特定のテーブルに挿入します)。状態変更によるバッチクエリの問い合わせ

処理した後に読み込んだデータを削除するつもりはなく、代わりに処理済としてマークしたいだけです。

@Bean 
    public ItemReader<RdJsonStore> reader(){ 
     JpaPagingItemReader<RdJsonStore> reader = new JpaPagingItemReader<>(); 
     reader.setEntityManagerFactory(entityManagerFactory); 
     reader.setQueryString("select e from RdJsonStore e "+ 
           "where e.jsonStoreProcessedPointer is null"); 
     reader.setPageSize(rawDataProperties.getBatchProcessingSize()); 
     return reader; 
    } 

それへのポインタが存在しないのであれば、それは読み取り専用になります。私はこのような何かに問い合わせを行った場合の質問は、なりJpaPagingItemReaderハンドルは、うまく読み取ります。私はエントリを処理した後にポインタを挿入します(バッチでは、1000エントリを処理し、すべてのIDをポインタテーブルにポストするようにします)。

このような実行時に返されたデータにItemWriter(およびJPA one)が変更した場合、ItemWriter(およびJPA one)は処理できますか?

ポインタ解決策が適用されない場合、DB-DBバッチジョブをどのように設計する必要がありますか?

私のソース・テーブルは次のようになります。

enter image description here

+0

いいえ、元のデータは変更されず、各ページについてクエリが再実行されるため、データが欠落します。 –

+0

@ M.Deinumそれは私が思ったことです:( – appl3r

答えて

0

あなたがJpaPagingItemReaderのコードを見れば、この方法doReadPage()のために、あなたがこの行に気づくでしょう、

Query query = createQuery().setFirstResult(getPage() * getPageSize()).setMaxResults(getPageSize());

createQuery() as、

private Query createQuery() { 
     if (queryProvider == null) { 
      return entityManager.createQuery(queryString); 
     } 
     else { 
      return queryProvider.createQuery(); 
     } 
    } 

ページごとにクエリが作成/実行されますが、ページ番号は新しいデータセットごとに再計算されず、ページ番号の再計算も意味をなさないことがわかります。

getPageSize()は常に設定値を返します。getPage()は最後に計算されたページ番号(以前に処理されたページ+ 1)を返します。したがって、データが縮小している場合は、ページ番号計算も再開します= 0であり、JpaPagingItemReaderでは発生しませんので、コメントにM Deinumで指定されたデータが失われます。 のデータのロックがジョブの実行中に通常想定されていても、ソートキーとして最後に新しいレコードが追加されていれば、新しいデータの追加が正常に機能します。

現在のジョブ実行中に行をPROCESSEDとマークすると、フレームワークによってすでに処理されているため(レコードが2回処理されないため)、目的はありません。

は、次のジョブの実行ためを処理し、それが(ジョブ実行中)WHERE句の一部ではない別のフラグを更新することによって処理し、その後の終わりにすることが可能と何が必要かもしれませんが、レコードをマークしていますジョブ - WHERE句の一部であるフラグを更新します(処理されたレコードについてはWHERE句で使用します)。

+0

私は自分の仕事がユーザーによって手動で開始されるので、それらをマークしたいと思います。そして、彼らが同じリソースにJobを再び起動すると、データを複製できます。私が読むときではなく、書くときにこれを処理してください。 – appl3r

関連する問題