1

UnitOfWorkハイバネートの上に Guice-persist を使用してバックグラウンド タスク メソッド (Quartz が運用) を使用しています。バックグラウンド タスクは、現在のトランザクションをタスクの途中でコミットする必要があるサービスを呼び出し、別のトランザクションを続行します。現在の UnitOfWork をコミットして新しいものを作成するにはどうすればよいですか?

class BackgroundJob {
    @Inject UnitOfWork unitOfWork;
    @Inject MyService myService;
    public void run() {
        try {
            unitOfWork.begin();
            myService.foo();
        } finally {
            unitOfWork.end();
}   }   }

class MyServiceImpl implements MyService {
    @Override public void foo() {
        foo1();
        // I would like to commit here and start a new transaction
        foo2();
}   }

UnitOfWork このサービスも Guice によって管理されますが、シングルトンであり、そのまま呼び出し元にアクセスすることはできません。

理想的には、サービス署名を変更したくありません。回避策は、呼び出し元が にUnitOfWorkパラメーターとして2 つを与えることfoo()ですが、これは少しハッキングされているようです。

編集:将来の仲間の読者が使いやすくするために、ColinD によって提供されたソリューションの私の実装を次に示します。これは法案にうまく適合します:

class BackgroundJob {
    @Inject UnitOfWork unitOfWork;
    @Inject MyService myService;
    public void run() {
        try {
            unitOfWork.begin();
            myService.foo();
        } finally {
            unitOfWork.end();
}   }   }

class MyServiceImpl implements MyService {
    @Override public void foo() {
        foo1();
        foo2();
    }
    @Transactional private void foo1() { ... }
    @Transactional private void foo2() { ... }
}
4

2 に答える 2

4

私の記憶が正しければ、Guice Persist の作業単位は単一のトランザクションではありません。むしろ、単一の Web リクエストや、この場合は単一のバックグラウンド ジョブなど、単一の作業単位を表します。単一のデータベース接続が作業単位全体に使用されると思いますが、その作業単位には複数の異なるトランザクションが含まれる場合があります。実際、作業単位を開始して終了するだけでは、トランザクションが開始または終了することはないと思います。

あなたがしたいことは、foo1()foo2()(ではなくfoo())の両方に で注釈を付けることだと思います@Transactional。両方の呼び出しをラップする外部トランザクションがない限り、それらはそれぞれ別のトランザクションで実行されます。

于 2012-02-09T14:59:05.830 に答える
0

これは法案に合うかもしれません。

class BackgroundJob {
    @Inject UnitOfWork unitOfWork;
    @Inject MyService myService;

    public void run() {
        try {
            unitOfWork.begin();
            myService.foo1();
            unitOfWork.end();
           unitOfWork.begin();
            myService.foo2();
            unitOfWork.end();
        } finally {
            unitOfWork.end();
        }
    }
}
于 2012-02-08T18:08:42.567 に答える