线上bug一例

本文描述了一个项目在上线后遇到的数据库连接池快速耗尽问题,原因是多用户并发访问导致缓存失效时大量线程同时访问数据库。提出了两种解决方案:一是通过加锁确保单一线程访问数据库;二是利用Redis缓存,即使重启后仍保留数据,避免频繁访问数据库。

 

问题描述:项目新打一个包,在测试环境没问题。上线后,数据库连接池中200个连接很快就被消耗完了。

原因:业务当中,需要查询大量的数据。项目在启动的时候,会初始化这些数据,初始化的速度大概需要100s。

业务代码的实现逻辑是,如果前端访问的时候,从缓存Map中查找释放有值。没有值的时候,直接访问数据库,并放到

缓存Map当中。

在测试环境,这种逻辑并没有什么问题。但是在线上环境,由于同一时间有多个用户去访问,当没有从Map当中取到缓存时,

大量的线程去访问数据库中的数据,导致了连接耗尽。

 

解决办法:

       方法一。加锁。从缓存中取不到数据的话,直接加锁。只允许一个线程去调用数据库的数据。

      方法二。使用redis作为缓存。当项目重启后,redis仍然有数据,不会去调用数据库中的数据(业务允许数据有较大的延迟性)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值