Spring ベースの Web アプリケーションには、データベース内のいくつかの統計カウンターをインクリメントするサービス実装があります。ユーザーの応答時間を台無しにしたくないので、Spring の @Async を使用して非同期に定義しました。
public interface ReportingService {
@Async
Future<Void> incrementLoginCounter(Long userid);
@Async
Future<Void> incrementReadCounter(Long userid, Long productId);
}
そして、次のようなスプリング タスク構成:
<task:annotation-driven executor="taskExecutor" />
<task:executor id="taskExecutor" pool-size="10" />
をpool-size="10"
使用すると、2 つのスレッドがカウンターを含む同じ初期レコードを作成しようとすると、同時実行の問題が発生します。
pool-size="1"
これらの競合を避けるために を設定するのは良い考えですか? これには副作用がありますか?統計を更新するために非同期操作を実行する場所がかなりあります。