2012-01-06 18 views
0

私はPlayでジョブを実行しています!それはしばらく時間がかかります(1時間以上)。この仕事の間、私はいくつかのIDを私のMySQLデータベースに保存したい。しかし、データを書き込んだ後に、私が(MySQLモニタを使って)私の端末のデータベースに問い合わせると、その行は更新されていないように見えます。ですから、ジョブが実行されている間にこのデータを更新する必要があります。ジョブの実行時にPlayフレームワークの行を更新します

これはコードです:

this.gaは私のJPAモデルのインスタンスである
this.ga.lastUID = msgnums[i-1]; 
this.ga.count = count[i-1]; 
this.ga.merge(); 

save()メソッドを使用すると、detached例外が発生します。 findById(this.ga.id)メソッドを使用して新しいオブジェクトを取得すると、save()を使用できますが、merge()と同じ結果が得られます(つまり、何も更新されません)。誰でもこれを修正する方法がありますか?

ありがとうございます!

答えて

4

ジョブの実行はトランザクションです。あなたの仕事でやることのすべては、仕事の最後にコミットされます。

あなたが望むものを達成するために、メインジョブで呼び出すサブジョブクラスを作成することができます。

public class SubJob extends Job { 

    private Ga ga; 

    public SubJob(Ga ga) { 
     this.ga = ga; 
    } 

    @Override 
    public doJob() throws Exception { 
     ga = ga.merge(); 
     ga.lastUID = msgnums[i-1]; 
     ga.count = count[i-1]; 
     ga.save(); 
    } 
} 

ような何かそして、あなたの主な仕事に、あなたは

new SubJob(ga).now().get(); 

を呼び出すあなたのサブジョブは、サブジョブの最後にコミットされる別のトランザクションで保存して実行されます。

このように、すべてのメインジョブをロールバックできないように注意してください。

関連する問題