我们在基于 Spring 的 Web 应用程序中有一个服务实现,它增加了数据库中的一些统计计数器。因为我们不想弄乱用户的响应时间,所以我们使用 Spring 的 @Async 将它们定义为异步的:
public interface ReportingService {
@Async
Future<Void> incrementLoginCounter(Long userid);
@Async
Future<Void> incrementReadCounter(Long userid, Long productId);
}
而spring任务配置是这样的:
<task:annotation-driven executor="taskExecutor" />
<task:executor id="taskExecutor" pool-size="10" />
现在,pool-size="10"
当两个线程尝试两个创建包含计数器的相同初始记录时,我们遇到了并发问题。
pool-size="1"
在这里设置以避免这些冲突是个好主意吗?这有什么副作用吗?我们有很多地方会触发异步操作来更新统计信息。