问题描述:项目新打一个包,在测试环境没问题。上线后,数据库连接池中200个连接很快就被消耗完了。
原因:业务当中,需要查询大量的数据。项目在启动的时候,会初始化这些数据,初始化的速度大概需要100s。
业务代码的实现逻辑是,如果前端访问的时候,从缓存Map中查找释放有值。没有值的时候,直接访问数据库,并放到
缓存Map当中。
在测试环境,这种逻辑并没有什么问题。但是在线上环境,由于同一时间有多个用户去访问,当没有从Map当中取到缓存时,
大量的线程去访问数据库中的数据,导致了连接耗尽。
解决办法:
方法一。加锁。从缓存中取不到数据的话,直接加锁。只允许一个线程去调用数据库的数据。
方法二。使用redis作为缓存。当项目重启后,redis仍然有数据,不会去调用数据库中的数据(业务允许数据有较大的延迟性)。
本文描述了一个项目在上线后遇到的数据库连接池快速耗尽问题,原因是多用户并发访问导致缓存失效时大量线程同时访问数据库。提出了两种解决方案:一是通过加锁确保单一线程访问数据库;二是利用Redis缓存,即使重启后仍保留数据,避免频繁访问数据库。
1374

被折叠的 条评论
为什么被折叠?



