2013-07-16 14 views
5

Im SpringBatch 2.1.7リリースコアとInfrastructure jarsを使用してCSVファイルを読み込んでDBに保存します。ステップ実行ID = 1を間違ったバージョン(2)で更新しようとしました。現在のバージョンは1です。

毎分実行するSpringクォーツスケジューラと統合されたバッチは、読み取りと書き込みで問題なく動作しますが、エラー "org.springframework.dao.OptimisticLockingFailureException:ステップ実行ID = 1を更新しようとしました現在のバージョンが1の間違ったバージョン(2) "

Txの競合のためです。どうすればこの問題を解決できるのかをお勧めします。

+0

こんにちは、この上の任意の更新? – user2583922

+0

解決しましたか? – surlac

+1

これはあなたの問題を解決するかもしれないhttp://ashamathavan.blogspot.in/2010/12/optimisticlockingfailureexception.html –

答えて

3

私はこの同じ例外がありました。

org.springframework.dao.OptimisticLockingFailureException: 
Attempt to update step execution id=0 with wrong version (2), where current version is 3 

私のケースでは、それは飲み込まれていたプロセスステップの失敗に起因していました。プロセッサが故障したにもかかわらず、Spring Batchがライターを起動しました。ログを調べて、プロセスステップが何かを完了して戻っていることを確認してください。

1

MattCが指摘したように、ItemProcessorが盗まれたときにこのエラーが発生しました。何らかの理由で、私のプロセッサの活動中に、私の例外だったので、それは、jobrepositoryとのデータソース接続を閉じました。

Encountered an error saving batch meta data for step step1 in job myjob. This job is now in an unknown state and should not be restarted. 
org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (1), where current version is 2 

スタックトレースの終わりに、私は見つけることができた:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection is closed. 

問題を特定するために、まず相を分離します。私はNoOpProcessorとNoOpItemWriterを構築しました。タスクレットを調整し、うまくいきました。だから私の問題は読者のものではなかった。

次に、「完全な」ItemWriter実装にロールバックして、うまくいきました。だから私の問題は作家にはなかった。 "フル"プロセッサを有効にすると、エラーが再び発生しました。だから、エラーがあって、デバッグを開始しました。

ので、残念ながら、私の答えは次のとおりです。デバッグ...

public class NoOpProcessor implements ItemProcessor<Object, Object> { 
    @Override 
    public Object process(Object arg0) throws Exception { 
     System.out.println("Input object: " + Objects.toString(arg0));  
     return arg0; 
    } 
} 

public class NoOpItemWriter implements ItemWriter<Object> { 
    @Override 
    public void write(List<? extends Object> items) throws Exception { 
     if (items != null) { 
      System.out.println("Qtty of items to be written: " + items.size()); 
      for (Object obj : items) { 
       System.out.println(Objects.toString(obj)); 
      } 
     } else { 
      System.out.println("The items list is null. Nothing to be written."); 
     } 
    } 
} 
関連する問題