teratailの皆様、お世話になっております。
ServletでWEBサイトを作っていて、トップページのお知らせ欄を下記のように実装しようと考えています。
実装の方法が妥当かどうか意見をいただければ幸いです。
1)データベースに、「お知らせ日時(システム時間)」を「bigint型」、「お知らせ内容」を「text型」として定義したテーブル(以下、お知らせテーブルとします)を作成します。
2)「ServletContextListener」のサブクラスを作り、フィールド変数で「public static final ConcurrentHashMap<Long,String> INFO_MAP = new ConcurrentHashMap<>();」と宣言、初期化します。
3)上記クラスの「contextInitialized」メソッドの中で、データベースからお知らせテーブルの内容を「INFO_MAP」へ格納します。
4)「HttpServlet」のサブクラス(トップページ)を作り、「doGet」メソッドの中で、ローカル変数で「TreeMap<Long,String> infoMap = new TreeMap<>();」と宣言、初期化します。
5)「infoMap」に「INFO_MAP」の中身を全て格納し、
for(Long time:infoMap.descendingKeySet()){
//timeを日付表示に整形し、お知らせを表示するHTMLソースを出力します。
}
6)お知らせを追加する場合は管理者だけがログインできる編集画面を作り、INFO_MAPおよびお知らせテーブルに新しいお知らせ情報を追加します。
「HttpServlet」や「EventListener」のサブクラス内でフィールド変数(例では静的定数ですが)を宣言するのは良くないと良く聞きます。
上記のサブクラスはTomcatのコンテナ内でインスタンスがただひとつだけ作られるため、上記のフィールド変数が各処理単位で共有され、値の整合性が取れなくなるからと理解しています。
上記の例では、値の整合性こそ取れるものの、ひとつの静的定数が大量の処理単位から同タイミングで参照された場合にオーバーヘッドの原因になるのではないかと懸念しています。
実際はどうなのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/31 14:22