ケース 1、サーブレットはデータベースにアクセスするコードを使用します。データベースには、活用すべきロック メカニズムがあります。これには 2 つの重要な理由があります。データベース自体が、そのデータの読み取りと書き込みを行う他のアプリケーションから使用される可能性があるため、アプリがそれ自体との競合に対処するには十分ではありません。また、独自のアプリケーションを、拡張されたクラスター化された Web コンテナーにデプロイすることもできます。このコンテナーでは、コードの複数のコピーが別々のマシンで実行されます。
そのため、データベースのロックを処理するための標準的なパターンは多数あります。悲観的ロックと楽観的ロックについて読む必要があるかもしれません。
サーブレット API と JBC 接続プーリングは、いくつかの有用な保証を提供するため、Java 同期を使用せずにサーブレット コードを記述できます (概念上、変数がメソッド スコープ内にある場合)。
Start transaction (perhaps implicit, perhaps on entry to an ejb)
Get connection to DB ( Gets you a connection from pool, associated with your tran)
read/write/update code
Close connection (actually keeps it for your thread until your transaction commits)
Commit (again maybe implictly)
したがって、唯一の本当の問題は、DB 内の競合に対処することです。上記のすべては、最近では JPA などを使用してかなり適切に行われる傾向がありますが、その裏では多かれ少なかれ何が起こっているのでしょう。
ケース 2: 静的メソッド。これはおそらく、すべてをメモリ構造に保持していることを意味します。これは (ある種のリモート呼び出しを禁止する)、単一の JVM と、独自のロックを管理することを意味します。JVM またはマシンがクラッシュすると、データが失われると思います。データに関心がある場合は、DB を使用することをお勧めします。
または、まったく別のアプローチはどうでしょうか。サーブレットは、永続的な JMS キューにメッセージを書き込むことによって、単に「投票」を記録します。他のプロセスがキューから投票を取得し、それらを追加します。この方法では、有権者にすぐにフィードバックを提供することはできませんが、ユーザーのエクスペリエンスを実際の (同様のシナリオで) 非常に複雑な処理から切り離します。