0

Spring IntegrationとSpring Batchを使用するSpring Bootアプリケーションがあります。ポーラーにファイルをドロップして処理します。このプロセスは、レコードをデータベースに挿入し、その後それらを読み取っていくつかの処理を行い、ファイルを書き込みます。 10個のレコードがあるとしましょう。私たちは初めて10のレコードを読み、10を書きました。サーバーを停止することなく、データベース上のSQLクライアントを介してすべてのレコードを削除し、同じファイルを再度実行すると、20レコードで10レコードが書き込まれます。 JPAやデータソースのキャッシュがあると思います。私たちは、JPAとキャッシュのいくつかの自動構成オプションを無効にしてみましたが、キャッシングを無効にするための適切な構成オプションが見つかりませんでした。SpringBootでSpringBatchのJPAを無効にする方法

少し詳細を質問に追加してください。

基本的にFileHandlerを持つcronスケジューラがあります。これは以下のhandleFileメソッドです。

public File handleFile(File file) throws Throwable { 
    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder(); 
    Job job = (Job) appContext.getBean("processInitialFileJob"); 
    JobExecution jb = jobLauncher.run(job, jobParametersBuilder.toJobParameters()); 
    .... 
} 

上記のコードでは、新しいJPAセッションがあるかどうか、またはJPAセッションをまったく使用しないようにするために、どうすればよいですか?このジョブは、データベースのキャッシュされた表現ではなく、毎回データベースから読み取る必要があります。

答えて

0

これはHibernateやJPAでは問題にはなりませんでしたが、以前の実行時のデータを保持しているStringBuilderの問題でした。私はこれが@JobScopeとしてセットアップされる必要があるので、ジョブの異なる実行間で再利用されないと考えています。

0

Hibernateを使用していますか? Hibernate First Levelキャッシュがuの問題を引き起こしている可能性があります。 Hibernateはあなたのセッションのローカルな第1レベルのキャッシュを管理します。だから一度あなたがセッションを作成し、その休止状態で任意のトランザクションを同期することができます。しかし、休止状態以外でテーブルを変更すると、セッションがフラッシュされてセッションが閉じられるまで、休止状態になりません。

これが起こっていないことを確認するには、ポーラーロジック内で新しいセッション(またはJPAの場合はEntityManager)を作成し、読み取り/プロセス/書き込みサイクルごとにセッションを閉じてみてください。

また、このhibernate.current_session_context_classがThreadに設定されていないことを確認してください。スレッドはポーラーで再利用できるので、同じHibernate Sessionを再び注入することができます。

+0

私は問題点があります。これを完全に無効にする方法はありますか?だから、基本的に私がテーブルを読んだら、テーブルのキャッシュされた表現ではなくテーブルを実際に読みたいと思っています。 –

関連する問題