2016-07-19 10 views
-2

私はJava Webアプリケーションを開発しており、変数の共有にいくつかの問題があります。 私の知る限りでは、2つの方法があります。 (1)静的変数を使用すると、各クラスはsetterとgetterを使用して、指定されたvar (2)にアクセスできます。Java EEのクラス間で変数を共有

私はそれぞれの方法に問題があります。最初のセッションでは、すべてのユーザー(セッションIDが異なる場合でも)は同じ値を共有します。 そして、第2のものについては、ゲッターを介したアクセスがプログラムにコンストラクターを強制的に使用させ、この場合、以前のユーザーに対して以前に得た値を失います。

だから、誰でも特定のセッションIDの情報を共有する方法を教えていただけますか?

より明確にするために:

私は自分のアプリケーションのビューの視点からモデルを区切ることを試みました。したがって、パッケージModelにはすべてのデータベースアクセスまたはWebサービス要求が含まれ、Viewパッケージにはすべてのサーブレットページとユーザーのプログラムとの対話が含まれます。 ユーザがオプションを選択すると、この情報はパブリックstatic varに格納され、他のクラスはアクセスできます。しかし、2人のユーザーが2つの異なるオプションを選択すると競合が発生します。変数が静的である原因... クラス間で共有可能な変数が必要です。指定されたユーザーに対してのみ値を保持してください。

+0

私たちは本当にあなたに役立つより詳細な詳細量が必要です。どんな種類の変数ですか?それらはユーザーごとにプライベートですか?アプリケーション全体でグローバルですか?おそらくあなたの投稿を編集し、詳細を提供してください。 – stdunbar

答えて

1

静的変数を使用して変更可能状態を格納する最初のオプションは、Java EE Webアプリケーションでは機能しません。同じサーバー上の異なるユーザーに同じ値が表示されることは間違いありません。それに加えて、アプリケーションの複数のインスタンスがデプロイされている場合、あるサーバーの静的変数に別のサーバーに含まれている静的変数と異なる値が含まれる可能性があります。それらの前にロードバランサがラウンドロビン要求を送信すると、ユーザは異なる要求に対して異なる状態を見ることができます。そのオプションを除外することができます。

2番目のオプション「(2)setterとgetterを使用して」は、まったく明確ではありません。

状態を1人のユーザーだけに見えるようにしたい場合は、HttpSessionに配置することができます。 HttpSessionに格納されているものは、ログインしている現在のユーザーに固有のものです。これは一時的な記憶場所であり、セッションがタイムアウトするとセッションの内容が消えます。 HttpSessionにあまりにも多くのものを置くことは問題になる可能性があります。ノードがノード間で情報をコピーして、すべてのサーバーのセッション内容を最新の状態に保つために、多くのメモリを消費する可能性があり、クラスタ化されたアプリケーションの速度低下を引き起こす可能性があります。 (代わりに、特定のサーバーにユーザーを固定して、負荷が不均等に分散している)。

ユーザー固有の情報をデータベースに保存することをお勧めします。そうすれば、データはアプリケーションのすべてのインスタンスで利用できる1か所にあり、データベースから取得した他のデータと同様にキャッシュすることができ、アプリケーションは適切なユーザーだけがそれを見ることができるようになります。また、セッションがタイムアウトすると、データは消えずに永続的になります。

+0

ありがとう、私はhttpSessionを知らなかった。実際には、各ユーザーに必要なすべてのデータを保存(設定および取得)することができます。 – pseudo2188

関連する問題