type
status
date
slug
summary
tags
category
icon
password
写在前面
唠叨两句
公司有个Springboot的项目,使用hikari的数据库连接池。前几天,生产炸了,所有操作都很缓慢,最后发现是数据库连接池打满了,临时解决方案是提升数据库连接池。突然想到了之前手上的项目也碰到过类似问题,解决方案都是提升数据库连接池。突然有了疑惑“数据库连接池,是不是配置的越大越好呢?”
正文
在讨论之前,我们先搞清楚,什么是数据库连接池呢?为什么用呢?
数据库连接池
数据库连接池(Database Connection Pool)是用于管理和复用数据库连接的机制。其核心目的是提高数据库访问效率,减少频繁创建和销毁连接的开销。
为什么需要数据库连接池?
直接连接数据库时,每次请求都要:
- 建立连接(耗时、耗资源)
- 执行 SQL
- 关闭连接
如果每个请求都这样做,系统性能会非常低,特别是高并发时容易拖垮数据库。
所以,大佬们便引入了数据库连接池的概念,其优势在于
- 复用连接:连接创建后重复使用,减少开销。
- 提高性能:避免频繁连接/断开。
- 连接管理:控制最大连接数,避免数据库被压垮。
- 可配置:如设置最小/最大连接数、空闲时间、超时时间等。
数据库连接池的工作原理是:
- 启动时,连接池预先创建一定数量的连接(比如 10 个),放在“池子”里。
- 应用请求数据库连接时,从池中“借”一个连接。
- 用完后,连接不会关闭,而是归还到池中。
- 如果池中没有可用连接:等待(阻塞或超时);或者新建连接(如果没达到最大连接数);或者报错(如果已经达到上限)
数据库连接池都有哪些?
名称 | 特点 |
HikariCP | 性能优越、轻量级,是现在最推荐的 |
Druid | 阿里巴巴开发,功能强大,监控友好 |
C3P0 | 较早的连接池,实现简单,功能一般 |
DBCP | Apache 提供,功能中等,不如 Hikari 快 |
配置方案
回到原问题,数据库连接池,是不是配置的越大越好呢?显然肯定不是。它有很多限制:
- 数据库资源限制:数据库服务器本身有最大连接数限制,过多连接会消耗更多内存和CPU资源,甚至可能导致数据库性能下降。
- 应用服务器资源:每个数据库连接都会占用一定的内存,连接数过多会增加应用的内存开销。
- 上下文切换开销:过多的连接可能导致数据库在处理并发请求时产生更多的上下文切换,反而降低性能。
连接池大小应该基于应用的实际并发访问量来设定,而不是盲目设置很大的值。一般建议的连接池大小计算公式是:
对于典型的Web应用,通常10-20个连接就足够了。
p.s.如何查看核心线程数
Spring Boot中的Hikari配置示例
总结
所以,数据库连接池的数量不是越大越好,根据你的实际场景来。如果你的场景没有特别复杂的数据库访问,默认的数值已经完全能满足了。
- -------END-------
天行健,君子以自强不息;地势坤,君子以厚德载物
欢迎关注blog:http://myblog.doubletree.fun 公众号:Doubletree的杂七杂八 csdn:https://blog.csdn.net/qq_27808011
- 作者:Doubletree
- 链接:https://blog.doubletree.fun/article/1ff49e7a-9398-8055-8b8e-f4b35e5d72bd
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。