背景
生产环境,运维人员核对实时账单和累帐信息,发现有部分用户数据不一致;
问题描述
消费者日志报生产者线程池满
图1
生产者堆栈信息部分如下:
图2
问题分析
- 数据不一致产生原因:
累帐表数据是消费者SumCharge服务更新,更新完成后调用生产者AccountProcess服务,由于生产者服务处理慢导致返回超时,更新实时账单表失败;
- 生产者AccountProcess服务处理慢原因:
分析AccountProcess堆栈信息发下,100个线程中正常处理的有8个,其他92个线程都在等待获取数据库连接getConnection,因此真正在进行任务处理的线程只有8个
- 查看dbcp线程池配置
配置文件中并没有对线程池进行配置,因此使用的是默认值
maxActive: 链接池中最大连接数,默认为8.
验证
Dbcp=默认值
查看堆栈信息发现在处理数据的只有10个线程,其中2个线程在写日志
maxActive=32
将dbcp线程池设置为32后,堆栈信息如下,其中在处理数据的线程数有37个
修改配置
#连接池初始化大小
<property name="initialSize" value="8" />
#连接池中最大连接数,默认为8
<property name="maxActive" value="32" />
#当连接池资源耗尽时,调用者最大阻塞的时间,超时将跑出异常。单位,毫秒数;默认为-1.表示永不超时.
<property name="maxWait" value="5000" />