ロック・シナリオでの例外処理の実装

LockTimeoutException 例外または LockDeadlockException 例外が発生したときに、ロックが過度に長い時間保留されないようにするために、アプリケーションは、予期しない例外をキャッチし、予期しないことが発生したときに rollback メソッドを呼び出す必要があります。

手順

  1. 例外をキャッチし、結果のメッセージを表示します。
    try {
    ...
    } catch (ObjectGridException oe) {
    System.out.println(oe);
    }

    結果、次の例外が表示されます。

    com.ibm.websphere.objectgrid.plugins.LockDeadlockException: Message
    このメッセージは、例外が作成されてスローされるときに、パラメーターとして渡されるストリングを表します。
  2. 例外の後、トランザクションをロールバックします。
    Session sess = ...;
    ObjectMap person = sess.getMap("PERSON");
    boolean activeTran = false;
    try
    {
        sess.begin();
        activeTran = true;
        Person p = (IPerson)person.get("Lynn");
        // Lynn had a birthday, so we make her 1 year older.
        p.setAge( p.getAge() + 1 );
        person.put( "Lynn", p );
        sess.commit();
        activeTran = false;
    }
    finally
    {
        if ( activeTran ) sess.rollback();
    }
    コード・スニペットの finally ブロックは、予期しない例外が発生したときにトランザクションがロールバックされるようにしています。LockDeadlockException 例外のみでなく、発生する可能性のあるその他の予期しない例外もすべて処理します。finally ブロックは、commit メソッドの呼び出し時に例外が発生するケースも処理します。この例は、予期しない例外を処理する唯一の方法ではありません。 アプリケーションが、発生する予期しない例外のいくつかをキャッチし、 そのアプリケーション例外の 1 つを表示するケースも存在するかもしれません。 適宜 catch ブロックを追加できますが、 アプリケーションは、コード・スニペットがトランザクションを 完了せずに終了しないようにする必要があります。