背景
通过定时任务对批量数据进行数据库操作,使用到线程池,并且使用到了生产者消费者设计模式。
异常现象
新的请求拿不到数据库连接,提示连接池连接已满
异常代码
SessionHolder sessionHolder = new SessionHolder(new Session());
Executors.newFixedThreadPool(10).submit(()->{
// 1.查询数据表
minder.getFromDb();
// 2.此处释放线程
sessionHolder.released();
});
原因
由于一个SessionHolder 对象只能对一个session进行release,导致线程池中的其他的线程无法被release
反思
- 代码异常可以避免,将sessionHodler放到每个线程中创建
- 首先发现异常的是我,但是我却没有及时反馈,导致错过修复的最佳时期
解决措施
- 代码回滚
- 增加监控报警
- 新上逻辑新增codereview
- 遇见异常,及时抛出
网友评论