1

最近、Java クラス レベルの Domino オブジェクトが消えてしまうという問題に悩まされています。たとえばlotus.domino.Session、(非静的) クラス レベル変数に を配置し、次のコード行でそれを使用しようとすると、次のようになります。

NotesException: Object has been removed or recycled

マネージド Beanを使い始める前は、これらの問題はありませんでしたが、現在では、リクエスト スコープの Bean やプレーンな Java オブジェクトで常に問題が発生しているようです。私はisRecycled()多くの場所にチェックを追加してきましたが、なぜ以前はチェックを行う必要がなかったのか疑問に思っていました。Domino オブジェクトがシリアライズされていないことはわかっていますが、リクエストまたはエージェントの期間中に留まる前です。

今日、この例外を与えるコードを別のデータベースにコピーしましたが、例外は発生しませんでした。次に、そのデータベースから元のデータベースにxsp.propertiesをコピーしましたが、そこでも例外は発生しませんでした。一度に1行ずつ削除することで、これがある場合に次のことがわかりました。

xsp.application.timeout=10

例外は発生しません。削除すると例外が発生します。誰かが理由を理解していますか?デフォルトは 30 分ですが、アプリケーションのタイムアウトを設定しない限り、セッション オブジェクトはナノ秒で消えてしまうようです。セッションを SSJS から Java に渡し、コンストラクター コードに格納します。

private Session session;    

public Domino(Session session) {
    this.session = session;
}

ご覧のとおり、これはマネージド Bean ではありません。私がテストしたドミノのバージョンは 9.0.1 ですが、8.5.2 でもこのコードを使用する必要があります。コードはbeforePageLoadイベントで実行されています。

私の問題は解決したようですが、ここで何が起こっているのかを理解したいと思います。

アップデート1

しばらく (おそらく 10 分以上) 待ってから XPage をリロードすると、メイン データベースでエラーが発生します。他のデータベースでは、エラーが発生したことはありません。

Update2

昨日、常に機能していたデータベースから完全なxsp.propertiesを追加し直しました。8時間経っても、元のデータベースでも問題なく動作します。これも必要なようです:

xsp.persistence.mode=basic

これは、「ページをメモリに保持する」ことを意味します。XPage は、この設定なしで (単一の HTTP 要求内で) すぐにシリアル化されるようです。

4

3 に答える 3

1

これは、8.5.2 の既知のバグが原因であると考えられます。同じ問題が発生しました。唯一の回避策は、実際には必要のないリサイクル コードを削除することでした。APAR の例はあまり役に立ちません。単一のドキュメントをリサイクルするためのループ回避のみをカバーしていますが、他のオブジェクト (データベース、ビュー) には別のアプローチが必要です。

編集:内部オブジェクト キャッシュに関連する別の問題が発生する可能性があります。修正されたかどうかは不明です: オブジェクトを要求すると、(意図的に) 既にリサイクルされた内部キャッシュからオブジェクトを取得する場合があります。これは、Java オブジェクト ID を出力することで証明できます。これは 8.5.1 と 8.5.2 では大きな問題でしたが、R9 では発生しないと思います。テストしませんでした。

于 2013-11-06T11:33:15.190 に答える
0

親クラスの親に小さな変更を加えてアプリケーションをビルドすると、動作するようになりました。元のコードをコピーして貼り付けても、まだ機能していることを確認してください。

なんらかのビルドの問題だったようです。この問題が発生したのはこれだけではありませんが、次回は再保存、クリーニング、再構築を試みます。

于 2013-11-07T17:03:30.253 に答える