浅谈连接池
浅谈连接池数据库连接池是企业级应用必用的核心组件。一句话理解连接池连接池是数据库连接的共享充电宝系统没连接池每次充电都要买新充电宝创建连接→ 用完扔掉关闭连接→ 浪费有连接池从共享站租充电宝借连接→ 用完还回去还连接→ 高效为什么要用连接池传统方式问题严重// 每次操作都要创建连接 → 执行SQL → 关闭连接 for (int i 0; i 1000; i) { Connection conn DriverManager.getConnection(url, user, password); // 1. 创建连接耗时 Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT * FROM users); // ... 处理数据 rs.close(); stmt.close(); conn.close(); // 3. 关闭连接 }问题创建连接非常耗时TCP三次握手、数据库验证等频繁创建/关闭消耗大量资源数据库连接数有限容易耗尽连接池方式解决方案// 初始化时创建一批连接放在池中 ConnectionPool pool new ConnectionPool(10); // 创建10个连接 // 使用时从池中借用完还回 for (int i 0; i 1000; i) { Connection conn pool.getConnection(); // 从池中取很快 // ... 执行SQL conn.close(); // 实际是还回池中不是真关闭 }连接池工作原理应用启动 ↓ 初始化连接池 ↓ 创建N个连接放入池中 ↓ ┌─────────────────────────────────────────┐ │ 连接池内部结构 │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │连接1│ │连接2│ │连接3│ │... │ │ │ └─────┘ └─────┘ └─────┘ └─────┘ │ └─────────────────────────────────────────┘ ↑ ↑ ↑ 借出 借出 借出 ↓ ↓ ↓ 应用线程1 应用线程2 应用线程3主流连接池对比连接池特点适用场景性能HikariCP快如闪电代码少Spring Boot 默认追求性能⭐⭐⭐⭐⭐Druid功能全面监控强需要监控、防SQL注入⭐⭐⭐⭐DBCP2Apache出品稳定传统项目Tomcat内置⭐⭐⭐C3P0老牌兼容性好老项目维护⭐⭐ 核心参数详解1. 基础参数// HikariCP 配置示例 HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/test); config.setUsername(root); config.setPassword(123456); // 核心参数 config.setMaximumPoolSize(20); // 最大连接数 config.setMinimumIdle(10); // 最小空闲连接 config.setConnectionTimeout(30000); // 获取连接超时时间(ms) config.setIdleTimeout(600000); // 连接空闲超时时间(ms) config.setMaxLifetime(1800000); // 连接最大生命周期(ms) config.setConnectionTestQuery(SELECT 1); // 连接测试SQL2. 参数解释参数默认值说明调优建议maximumPoolSize10池中最大连接数CPU核心数 * 2 磁盘数minimumIdle同max最小空闲连接数建议小于max减少资源占用connectionTimeout30000获取连接超时(ms)网络差时调大idleTimeout600000空闲连接超时(ms)默认10分钟可调小maxLifetime1800000连接最大存活时间(ms)默认30分钟MySQL wait_timeout要大于此值validationTimeout5000连接验证超时(ms)网络差时调大代码实战1. Spring Boot 配置 HikariCPapplication.ymlspring: datasource: url: jdbc:mysql://localhost:3306/my_db?useSSLfalseserverTimezoneUTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # HikariCP 配置 hikari: # 连接池大小 maximum-pool-size: 20 minimum-idle: 5 # 连接超时和生命周期 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 # 连接测试 connection-test-query: SELECT 1 validation-timeout: 5000 # 其他优化 auto-commit: true pool-name: MyHikariPool # 连接泄漏检测 leak-detection-threshold: 60000 # 60秒2. 纯 Java 使用 HikariCPimport com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class ConnectionPoolDemo { private static HikariDataSource dataSource; static { // 1. 创建配置 HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/test); config.setUsername(root); config.setPassword(123456); config.setDriverClassName(com.mysql.cj.jdbc.Driver); // 2. 连接池配置 config.setMaximumPoolSize(20); config.setMinimumIdle(5); config.setConnectionTimeout(30000); config.setIdleTimeout(600000); config.setMaxLifetime(1800000); config.setConnectionTestQuery(SELECT 1); // 3. 创建数据源 dataSource new HikariDataSource(config); } public static void main(String[] args) { // 4. 使用连接池 try (Connection conn dataSource.getConnection(); PreparedStatement pstmt conn.prepareStatement(SELECT * FROM users WHERE id ?)) { pstmt.setInt(1, 1); try (ResultSet rs pstmt.executeQuery()) { while (rs.next()) { System.out.println(用户: rs.getString(username)); } } } catch (Exception e) { e.printStackTrace(); } } // 5. 关闭连接池应用退出时 public static void closePool() { if (dataSource ! null) { dataSource.close(); } } }3. Druid 连接池配置application.ymlspring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # Druid 配置 druid: # 连接池大小 initial-size: 5 min-idle: 5 max-active: 20 # 获取连接超时 max-wait: 60000 # 连接检测 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false # 监控统计 filters: stat,wall,slf4j stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin web-stat-filter: enabled: true url-pattern: /* # 防SQL注入 filter: wall: enabled: true连接池监控1. HikariCP 监控HikariPoolMXBean poolMXBean dataSource.getHikariPoolMXBean(); System.out.println(活跃连接: poolMXBean.getActiveConnections()); System.out.println(空闲连接: poolMXBean.getIdleConnections()); System.out.println(总连接: poolMXBean.getTotalConnections()); System.out.println(等待线程: poolMXBean.getThreadsAwaitingConnection());2. Druid 监控界面启动应用后访问http://localhost:8080/druidSQL监控查看SQL执行情况数据源连接池状态Web应用URI访问统计Session监控用户会话⚡ 性能优化实践优化案例电商大促场景# 双11大促配置 spring: datasource: hikari: maximum-pool-size: 50 # 根据QPS调整 minimum-idle: 10 connection-timeout: 10000 # 快速失败 idle-timeout: 300000 # 5分钟 max-lifetime: 1200000 # 20分钟 leak-detection-threshold: 30000 # 30秒泄漏检测 # MySQL 优化参数 >连接池大小计算公式// 经验公式 connections (core_count * 2) effective_spindle_count // 示例4核CPU1个磁盘 // connections (4 * 2) 1 9 // 实际设置 10-20 即可常见问题与解决问题1连接泄漏现象连接数达到上限应用卡死// 错误没有关闭连接 Connection conn dataSource.getConnection(); // ... 使用后忘记 conn.close() // 正确使用 try-with-resources try (Connection conn dataSource.getConnection(); Statement stmt conn.createStatement()) { // 自动关闭 }问题2连接超时解决hikari: connection-timeout: 30000 # 调大超时时间 validation-timeout: 5000问题3MySQL 8小时断开原因MySQLwait_timeout默认8小时解决-- 修改MySQL配置 SET GLOBAL wait_timeout 28800; -- 8小时 SET GLOBAL interactive_timeout 28800;或配置连接池hikari: max-lifetime: 28000000 # 小于8小时 connection-test-query: SELECT 1问题4连接数不够// 查看当前连接数 show processlist; // 在代码中监控 Scheduled(fixedDelay 5000) public void monitorPool() { HikariPoolMXBean pool dataSource.getHikariPoolMXBean(); log.info(连接池状态: 活跃{}, 空闲{}, 等待{}, pool.getActiveConnections(), pool.getIdleConnections(), pool.getThreadsAwaitingConnection()); }连接池工作流程获取连接流程1. 应用请求连接 ↓ 2. 检查空闲连接池 ├── 有空闲连接 → 直接返回 └── 无空闲连接 → 检查是否达到maxPoolSize ├── 未达到 → 创建新连接 └── 已达到 → 等待connectionTimeout ├── 有连接释放 → 获取 └── 超时 → 抛出异常归还连接流程1. 应用调用 conn.close() ↓ 2. 连接池检查连接状态 ├── 连接有效 → 放回空闲池 └── 连接无效超时、断开→ 销毁连接 ↓ 3. 如果空闲连接 minIdle └── 关闭多余连接生产环境配置示例微服务场景# order-service 配置 spring: datasource: url: jdbc:mysql://mysql-cluster:3306/order_db hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 10000 max-lifetime: 300000 # 5分钟 leak-detection-threshold: 60000 # 连接属性 >高并发场景// 动态调整连接池大小 RestController public class PoolController { Autowired private HikariDataSource dataSource; PostMapping(/pool/adjust) public String adjustPoolSize(RequestParam int size) { if (size 0 size 100) { dataSource.setMaximumPoolSize(size); return 连接池大小调整为: size; } return 参数错误; } GetMapping(/pool/status) public MapString, Object getPoolStatus() { HikariPoolMXBean pool dataSource.getHikariPoolMXBean(); MapString, Object status new HashMap(); status.put(active, pool.getActiveConnections()); status.put(idle, pool.getIdleConnections()); status.put(total, pool.getTotalConnections()); status.put(waiting, pool.getThreadsAwaitingConnection()); return status; } }最佳实践1. 连接管理// 使用模板方法避免连接泄漏 public T T execute(ConnectionCallbackT callback) { try (Connection conn dataSource.getConnection()) { return callback.doInConnection(conn); } catch (SQLException e) { throw new RuntimeException(数据库操作失败, e); } } // 使用 execute(conn - { try (PreparedStatement pstmt conn.prepareStatement(...)) { // 执行SQL return null; } });2. 连接验证# 生产环境必须配置验证 hikari: connection-test-query: SELECT 1 validation-timeout: 50003. 监控告警// 集成监控系统 Scheduled(fixedRate 10000) public void checkPoolHealth() { HikariPoolMXBean pool dataSource.getHikariPoolMXBean(); int waiting pool.getThreadsAwaitingConnection(); if (waiting 10) { // 发送告警连接池排队过多 alertService.sendAlert(连接池告警, 等待线程: waiting); } }学习建议先理解原理为什么需要连接池动手配置在Spring Boot中配置HikariCP监控调试使用Druid监控界面查看SQL性能测试用JMeter压测不同配置生产实践参与真实项目的数据库优化连接池选择指南场景推荐理由Spring Boot 新项目HikariCP默认性能最好需要监控功能Druid监控全面功能丰富老系统迁移DBCP2兼容性好简单小项目HikariCP轻量快速总结数据库连接池是企业级应用的基础设施理解它的工作原理和优化方法是成为中级Java开发的必备技能。记住关键点连接池复用连接避免频繁创建销毁合理配置连接数不是越多越好一定要监控连接池状态使用try-with-resources避免连接泄漏下一步在实际项目中配置连接池观察监控数据理解每个参数的作用。

相关新闻

GPT-5.4 炸场发布!疯狂屠榜、超过Claude 和 Gemini

GPT-5.4 炸场发布!疯狂屠榜、超过Claude 和 Gemini

今天凌晨2点10分,OpenAI正式发布了GPT-5.4模型,已经可以在ChatGPT、API和Codex中使用了。本次共有Thingking和Pro两种模型,在性能方面超过了Claude最新的Opus 4.6和谷歌的Gemini 3.1pro。性能更强、成本更低咱们先聊聊5.4的核心技术亮点&…

2026/7/5 13:19:29 阅读更多 →
强化学习,第五部分:时间差分学习

强化学习,第五部分:时间差分学习

原文:towardsdatascience.com/reinforcement-learning-part-5-temporal-difference-learning-cacf7854fe0c https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d06ac84afe0e1e525667e94eace4989f.png 简介 强化学习是机器学习的…

2026/7/4 1:14:18 阅读更多 →
免费好用的论文查重网站推荐

免费好用的论文查重网站推荐

这里整理了免费额度充足、检测靠谱、适合学生党的论文查重网站,按免费力度、数据库、精准度、适用场景分类推荐,附核心信息与使用建议,方便你按需选择。 一、每日 / 长期免费(初稿首选,反复修改无压力) 1…

2026/7/6 1:03:06 阅读更多 →

最新新闻

原神成就管理终极指南:YaeAchievement让数据导出变得如此简单![特殊字符]

原神成就管理终极指南:YaeAchievement让数据导出变得如此简单![特殊字符]

原神成就管理终极指南:YaeAchievement让数据导出变得如此简单!🎯 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 还在为原神中数百个成就的追踪和管理而…

2026/7/6 6:24:54 阅读更多 →
大模型:临时会话

大模型:临时会话

大模型的临时会话 临时会话指的是在一次对话会话(Session)期间,大模型能够记住之前交流过的内容,从而理解上下文、进行连贯对话的能力。会话结束后,这些记忆通常会被丢弃。 核心机制 1. 上下文窗口(Conte…

2026/7/6 6:24:54 阅读更多 →
为什么很多人会误解水泵的‘力气’大小

为什么很多人会误解水泵的‘力气’大小

为什么很多人会误解水泵的‘力气’大小 你是不是也听过这样的说法:“买水泵就选功率大的,劲儿足!”可结果装上后发现,水还是上不了三楼,或者电费蹭蹭涨?其实,水泵的“力气”并不只看功率&#x…

2026/7/6 6:22:53 阅读更多 →
西安GEO公司推荐与避雷指南

西安GEO公司推荐与避雷指南

1. 西安企业做GEO常见踩坑情况不少西安本地企业在布局AI流量渠道时,很容易踩中服务陷阱:有的机构只讲概念不落地,收了费用后只给几份通用文档就结束服务;有的只做前端内容铺设,没有配套线索承接工具,引来的…

2026/7/6 6:22:53 阅读更多 →
AMD Ryzen调试工具SMUDebugTool:5步解锁处理器隐藏性能

AMD Ryzen调试工具SMUDebugTool:5步解锁处理器隐藏性能

AMD Ryzen调试工具SMUDebugTool:5步解锁处理器隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…

2026/7/6 6:20:52 阅读更多 →
如何在FGO中实现自动化战斗:Fate/Grand Automata完整技术指南

如何在FGO中实现自动化战斗:Fate/Grand Automata完整技术指南

如何在FGO中实现自动化战斗:Fate/Grand Automata完整技术指南 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA Fate/Grand Automata(FGA)是一款专为《Fate/Grand Order》玩家…

2026/7/6 6:18:51 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻