最近、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 要求内で) すぐにシリアル化されるようです。