@[toc]
数据库连接池 BoneCP、HikariCP 等
BoneCP
官方说法 BoneCP 是一个高效、免费、开源的 Java 数据库连接池实现库
设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP 的速度是最快的,要比当时第二快速的连接池快 25 倍左右
完美集成到一些持久化产品如 Hibernate 和 DataNucleus 中
BoneCP 特色
- 高度可扩展,快速;连接状态切换的回调机制
- 允许直接访问连接;自动化重置能力
- JMX支持
- 懒加载能力
- 支持XML和属性文件配置方式
- 较好的Java代码组织
- 100%单元测试分支代码覆盖率
- 代码40KB左右
Druid
Druid 是 Java 语言中最好的数据库连接池,Druid 能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统
尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid 仍能够保持 100% 正常运行
主要特色
- 为分析监控设计
- 快速的交互式查询
- 高可用
- 可扩展
- Druid是一个开源项目,源码托管在github上。
Tomcat Jdbc Pool
Tomcat 在 7.0 以前都是使用 common-dbcp 做为连接池组件,但是 dbcp 是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂
Tomcat 从 7.0 开始引入了新增连接池模块叫做 Tomcat jdbc pool,基于Tomcat JULI,使用 Tomcat 日志框架,完全兼容 dbcp,通过异步方式获取连接,
支持高并发应用环境,超级简单核心文件只有8个,支持 JMX,支持XA Connection。
HikariCP
HikariCP 是 Spring Boot 2.0 之后默认采用的连接池,HikariCP 号称是性能最好的连接池,是一个高性能的 JDBC 连接池
HikariCP 基于 BoneCP 做了大量的优化和改进
大型系统一般都有专门的监控类软件,如 skywalking、prometheus 等,因此连接池只需要做好的他的本职工作即可,应该更加关注连接池的性能
Druid 适合中型系统是因为他自带一些本职工作之外的功能,如 SQL 监控、扩展、SQL 防注入等
C3p0
C3p0 是开源的 JDBC 连接池,实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展
目前使用它的开源项目有 Hibernate、Spring 等
他是单线程的,性能较差,比较适用于小型系统,代码600KB左右
Dbcp
Dbcp 全称(Database Connection Pool),由Apache开发的一个 Java 数据库连接池项目, Jakarta commons-pool 对象池机制,
单独使用 dbcp 需要3个包
1. common-dbcp.jar
2. common-pool.jar
3. common-collections.jar
预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。
Dbcp 是单线程,并发量低,性能不好,适用于小型系统。
Tomcat 7.0 之前使用的连接池组件就是DBCP
Tomcat 7.0 之后使用了性能更好的 Tomcat Jdbc Pool 连接池
LRU
LRU 全称 Least Recently Used,缓存淘汰算法
LRU 是思路是,最近使用过的缓存被认为是有用的,很久都没用过的数据应该是无用的,当内存空间不足时,应该优先淘汰很久没使用过的缓存
PSCache
PSCache 全称 Prepared Statement Cache
Oracle 支持游标,一个 PreparedStatement 对应服务器一个游标,如果 PreparedStatement 被缓存起来重复执行,
PreparedStatement 没有被关闭,服务器端的游标就不会被关闭,性能提高非常显著
在类似SELECT * FROM T WHERE ID = ?这样的场景,性能可能是一个数量级的提升
PSCache 的核心数据结构是一个 LRUCache ,实现了 LinkedHashMap ,重写了 removeEldestEntry 方法
LRUCache 数据结构两个关键数据结构是哈希和链表,哈希可以快速判断一个数据是否存在,链表维护头尾节点
Java 自带 LinkedHashMap 正好包含了这两种数据结构
PS
C3p0、Dbcp 一般适合小型项目,HikariCP 适合中大型项目,一般来说,日常使用 HikariCP 或者 Druid 就足够了