http-session-or-database-approach を続けてこの質問をします。
私はこのアプローチに従うつもりです。
HTTPセッションに関して次のクエリがあります
ただし、すべてのカートデータをセッションに保存する方法を制御できますが、カートデータに特定の情報をセッションに保存する必要がありますか?
J2EEセッションBeanオブジェクトではなく、HttpSessionオブジェクトを参照していると想定します。
サーバーが1つしかない場合、セッションは、ユーザーがリクエストを行うたびにアクセスできる一種のグローバルマップのようなものです。大きなオブジェクトでも小さなオブジェクトでも、どちらにしてもマップに配置できますが、それらをそこにどれだけ長く置いたかによっては、問題が発生する可能性があります。
ほとんどのアプリケーションサーバーは、有効期限が切れたセッションを削除するため、訪問者がしばらくしてサイトを離れると予想される場合は、セッションのメンテナンスを行う必要はなく、セッションを期限切れにするだけでアプリケーションサーバーはクリーンアップできます。お先にどうぞ。
ただし、多くのユーザーがサイトに長期間滞在し、これらの長期的なオブジェクトがセッションに残る可能性があり、これを処理するための十分なメモリがない可能性がある場合は、他の方法が必要です。 。
最も簡単な方法は、ある種のLRUキャッシュを使用することです。たとえば、 commons LRUMap を使用して、マップに最大サイズを設定し、不要になったアイテムを削除することができます。この方法では、ラージオブジェクト用のグローバルキャッシュを作成できます。ユーザーが多すぎる場合、キャッシュはデータを削除するだけです。キャッシュミスが多いとパフォーマンスが低下しますが、少なくともすべてが適切に機能します。
結局のところ、キャッシュを保存するための十分なRAMと、ミスを処理するための十分なデータベース帯域幅がない場合、どのようなトリックを使用してもアプリはクラッシュします。
HttpSessionを使用することの欠点:
キャッシュとしてのグローバルマップへの欠点:
一般的なパターンは、可能な限り最小限の情報をメモリに格納することであり、有用なデータのみを格納することです。このアプローチにより、アプリケーションがスケーラブルになります。
本当にスケーラブルなアプリケーションが必要な場合は、JBoss/Wildflyやその他のJava EE Container。
Java EEにおける設計上の考慮事項は、EEはセッションBeanをできるだけ軽量に保つことです。