知识卡片
对象池模式用一次性预加载消解高并发下的重复查询瓶颈
内容
真实性能案例:新闻网站首页随机展示励志语,原实现每次请求都查一次数据库 (约5000条记录),10万PV高并发下连接被占满、响应飙升到2秒以上。诊断结论不是数据库慢, 而是不该每次都查——这批数据小且几乎不变,可在启动时一次性加载进内存,之后从内存随机 取。发散:这是对象池模式的典型应用——把频繁临时创建/查询、用完丢弃的操作,换成启动时 集中初始化、运行期反复复用。
参考来源
- 位置:《设计模式之禅(第2版)》第38章《新模式》38.2.1节(源文件:_epub-src/text/part0162.html)
- 结论依据:原文完整还原诊断过程:"在跟踪过程中,发现高峰期数据库连接偶尔出现占满情况,而且都是查询该表……问题找到了:每一次访问都会直接查询数据库,没有缓存……在10万PV的压力下服务器基本就垮掉了……怎么解决呢?好办,引入一个对象池,把这5000条记录……在启动时直接加载到内存中,在需要时再从内存中取得,以后查询不再与数据库交互……通过这样的修正,系统性能有了大幅提升,在不增加硬件的情况下,彻底解决了性能问题"。
- 原始内容:每一次访问都会直接查询数据库,没有缓存……在10万PV的压力下服务器基本就垮掉了……怎么解决呢?好办,引入一个对象池,把这5000条记录(根据评估最多不超过20000条记录)在启动时直接加载到内存中……通过这样的修正,系统性能有了大幅提升,在不增加硬件的情况下,彻底解决了性能问题。这就是对象池模式。