常用连接池
c3p0、hikari 的性能还是非常不错的,dbcp 相对是弱一些的。
C3P0
开发背景:开源社区项目,相对较早的Java连接池实现之一。 特点: 自动故障恢复:支持自动检测并重新连接断开的数据库连接,以及检测并关闭失效的连接。 配置灵活性:提供丰富的配置选项,允许用户精细控制连接池的行为。 扩展性:支持JNDI绑定和DataSource配置,便于集成到各种应用服务器环境中。 性能与稳定性: 性能:相较于后来出现的一些高性能连接池(如HikariCP),C3P0在并发性能上可能略逊一筹。 稳定性:经过长期实践和社区支持,C3P0在大多数场景下表现稳定,但有时可能遇到配置复杂度较高导致的问题。
DBCP
开发背景:由Apache软件基金会维护,作为Apache Commons项目的一部分。 特点: 轻量级:设计简洁,易于理解和使用,适合小型项目或对资源要求不高的场景。 基础功能完备:提供基本的连接池管理和监控功能,支持JNDI绑定。 可扩展:可通过扩展接口实现自定义连接管理策略。 性能与稳定性: 性能:在高并发场景下的性能表现一般,可能不如C3P0或其他更现代的连接池。 稳定性:基本稳定,但由于更新频率较低,对新数据库特性或Java版本的支持可能滞后。
Tomcat JDBC Pool
开发背景:由Apache Tomcat项目开发,作为Tomcat服务器内置的连接池组件。 特点: 高性能:设计时考虑了高并发场景,通过异步获取连接、优化连接回收策略等方式提高性能。 与Tomcat深度集成:与Tomcat服务器紧密配合,充分利用Tomcat的基础设施(如日志系统),适用于Tomcat部署的应用。 兼容性:几乎兼容DBCP的所有配置属性,迁移成本较低。 性能与稳定性: 性能:相较于C3P0和DBCP,Tomcat JDBC Pool在性能上有较大提升,特别是在高并发环境中。 稳定性:作为成熟服务器项目的组成部分,稳定性有保障,但可能需要关注与特定Tomcat版本的兼容性。
HikariCP
开发背景:由Brett Wooldridge开发的高性能连接池,强调速度、稳定性与可靠性。 特点: 极致性能:设计时充分考虑了性能优化,常被誉为“Java最快的连接池”,特别适合对响应时间有严格要求的系统。 简单易用:API设计简洁,配置选项精炼,易于理解和配置。 零损耗延迟:采用预编译SQL语句、优化字节码等手段,力求消除不必要的延迟。 性能与稳定性: 性能:在多次基准测试中表现出色,被认为是目前性能最佳的Java连接池之一。 稳定性:因其设计原则和持续的社区维护,HikariCP在实际使用中表现出高度的稳定性和可靠性。
Druid
开发背景:由阿里巴巴开发的数据库连接池组件,集成了监控统计功能。 特点: 全面监控:内建丰富的监控统计功能,如SQL执行耗时、并发连接数、SQL慢查询等,方便运维人员进行性能调优。 强大过滤与拦截:支持SQL防火墙、SQL解析与Rewrite等功能,增强系统的安全性与可维护性。 高度可配置:提供大量配置项,适应多种应用场景,支持通过Web Console动态调整配置。 性能与稳定性: 性能:在常规场景下性能优秀,虽然可能略逊于HikariCP,但综合功能更丰富。 稳定性:经过大规模生产环境验证,稳定性良好,尤其适合企业级应用。
总结来说,C3P0和DBCP是较早的连接池实现,功能齐全但性能一般;Tomcat JDBC Pool在高并发场景下有优势,与Tomcat服务器集成紧密;HikariCP以其极致性能和简洁设计受到青睐,特别适合对性能有严苛要求的系统;Druid则提供了丰富的监控与管理功能,更适合大型企业级应用。选择哪一种连接池应根据项目需求、性能预期、运维复杂度等因素综合考量。
数据库连接池的作用:
-
资源复用:连接池维护一组预先创建好的数据库连接,当应用程序需要时,可以从池中获取已存在的连接,而不是每次都新建连接。这样避免了创建和关闭连接的昂贵开销。
-
性能提升:通过复用连接,减少了数据库连接的创建和释放过程,极大地缩短了应用程序访问数据库的响应时间,提高了系统整体性能。
-
并发控制:连接池可以限制同时处于活动状态的连接数量,防止过多的并发连接对数据库造成过大压力,有助于保护数据库资源。
-
资源管理:连接池能够自动管理和释放闲置连接,比如定时回收长时间未使用的连接,或者在连接数量超过预设阈值时拒绝新的连接请求,从而避免了因忘记释放连接导致的资源泄漏。
-
故障恢复:某些连接池实现提供了故障恢复机制,当数据库连接出现异常时,可以尝试重新建立连接或从池中获取其他可用连接,增强了应用程序的健壮性。
主要参数
-
初始化连接数
-
最大连接数
-
最大空闲连接数 没连接也要保留的最大连接数
-
最小空闲连接数 空闲连接数小于这个,会进行补充
-
最大等待时间
-
等待队列数量
-
无效连接清除
-
检测数据库连接是否有效的SQL查询
-
连接有效性检查
原理
1.初始化连接池
初始化连接数为3, 最大连接数 为5
2.获取连接:
-
若池中有空闲连接,直接将其分配给请求者,并标记为正在使用。
-
若池中没有可用连接且当前连接总数未达到最大限制,连接池按照配置创建一个新的连接并分配给请求者。开放 4,5号窗口
-
若池中既没有空闲连接又已达最大限制,请求者进入等待队列,等待时间超过最大时间,拒绝连接
3.使用连接:
应用程序获得连接后,即可执行SQL查询、更新等操作。在此过程中,连接池并不干涉具体的数据库交互,只是作为连接的提供者。