3

Seam 2.2、Jboss 6.1、hibernate 3.5.6、およびMSQL Server 2008

このような機能があります。

public void deliverFile() {
    EntityManager jobbEntityManager = (EntityManager)Component.getInstance("jobbEntityManager");

    JobbStatusInterface jobbStatus = new JobbStatus();
    jobbStatus.setStatus(PluginStatus.INITIATED);
    jobbEntityManager.persist(jobbStatus);


            /**

                 Code here to save a file that takes a minutes
             **/





    jobbStatus.setStatus(PluginStatus.DONE);
    jobbEntityManager.flush();





    }
    public void checkJobb(){
    EntityManager jobbEntityManager =  (EntityManager)Component.getInstance("jobbEntityManager");

        jobbEntityManager.createQuery("from JobbStatus", JobbStatus.class).getResultList();


    }

10秒ごとにcheckJobbをポーリングしているので、deliveryFile()関数が実行された場合。

checkJobbはuppをキューに入れてクエリで停止するため、deliveryFile()関数が終了すると、6つすべてのcheckJobbs()が一度に終了します。

データベースから直接選択しても、それはロックされ、deliveryFile()が実行された後にクエリを終了します。

deliveryFileの実行中にcheckJobb()を実行できるように、これを気に入ってもらう方法はありますか?

4

2 に答える 2

0

通常の READ_COMMITTED 分離の代わりに READ_COMMITTED_SNAPSHOT。

ALTER DATABASE <dbname> SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
ALTER DATABASE <dbname> SET READ_COMMITTED_SNAPSHOT ON; 
ALTER DATABASE <dbname> SET MULTI_USER; 
于 2012-04-13T21:03:23.430 に答える
0

上記のコードを使用して何を達成したいのかわかりません。途中でジョブステータスを読み込んでジョブが開始されたかどうかを確認したい場合は、できない場合があります。データはまだコミットされておらず、他の関数で別のセッションを使用しているため、データを表示できない場合があります。

ステータスの最後の値のみがデータベースにコミットされます。

于 2012-04-13T14:27:11.097 に答える