3

私たちのものは、Weblogic 10 (本番環境でクラスター化) で実行される JSP/JSF ベースのアプリです。(ログインした) ユーザーがオブジェクトのタイムスタンプ ベースのロックを取得するシナリオがあります。ロックを取得すると、60 秒ごとにコードが実行され、ロックが更新/無効化されます。現在、ロックの詳細はデータベースに保持されています。つまり、60 秒ごとにロックを更新するために、更新クエリが起動されます。

このロジックを、データベースへのアクセスを回避できるアプリケーション層に移動しようとしています。そのため、以前に DB に書き込まれたデータは、HashMap で維持されるようになりました。ただし、HashMap は ServletContext オブジェクトに格納されます。新しいユーザーのロックを取得するために、 HashMap が ServletContext オブジェクトから取得され、操作が行われます。

しかし、ServletContext オブジェクトがクラスター間で複製されていないことが明らかになりました。たとえば、ユーザー 1 がオブジェクト 1 へのロックを取得したときにノード 1 で変更された HashMap があり、ユーザー 2 がログインすると、オブジェクト 1 へのロックを取得しようとしますが、要求はノード 2 にヒットします。私は、ロジックが失敗すると思いますよね?node-2 には更新された HashMap がないためです。

アイデア/提案はありますか?助けてください。

ありがとう、A

4

1 に答える 1

1

はい、プロジェクトの 1 つで同様のことを行い、weblogic サーバー上のすべてのクラスター化されたノード間で ServletContext を共有しました。

以下の weblogic のパラメータを確認してください

coherence-servletcontext-clustered

ServletContext の属性がクラスター化されるかどうかを示す true または false。true の場合、シリアライズ可能なすべての ServletContext 属性値がすべてのクラスター ノード間で共有されます。

指定されていない場合、デフォルトで false になります。これは主に、Servlet 仕様が ServletContext 属性が JVM に対してローカルであり、クラスター化されるべきではないことを示しているためです。

詳細については、http://docs.oracle.com/cd/E13924_01/coh.340/e14408/appparams.htmを参照してください。

于 2012-09-20T08:21:20.043 に答える