数据库连接池(Database Connection Pool)
所谓的数据库连接池(Database Connection Pool),就是用来分配,管理,释放数据库连接的。
你也许会问,好像我直接用 JDBC 也能够实现这些功能吧。嗯,你说的没错,JDBC 确实也可以,但是,你记不记得,我们使用 JDBC 技术的时候,每次用完了,是不是都会将连接关闭;等到下一次再用的时候,是不是都得将数据库连接再打开?
实际上,数据库链接资源是十分宝贵的,我们在小型的项目中还看不出来,在高并发的项目中,你会发现,这样频繁的打开和关闭数据库链接是对服务器的一种摧残,十分影响效率。
那么,数据库连接池是如何做的呢? 实现思路是这样的:在每次有访问的时候,数据库连接池会给用户分配一个数据库连接,当用户用完了连接之后,连接池再将连接回收,放回一个连接集合中:
主流数据库连接池
常用的主流开源数据库连接池有 C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid 等。
C3p0: 开源的 JDBC 连接池,实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有 Hibernate、Spring 等。单线程,性能较差,适用于小型系统,代码 600KB 左右。
DBCP (Database Connection Pool): 由 Apache 开发的一个 Java 数据库连接池项目, Jakarta commons-pool 对象池机制,Tomcat 使用的连接池组件就是 DBCP。单独使用 dbcp 需要 3 个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。
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。
BoneCP:官方说法 BoneCP 是一个高效、免费、开源的 Java 数据库连接池实现库。设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP 的速度是最快的,要比当时第二快速的连接池快 25 倍左右,完美集成到一些持久化产品如 Hibernate 和 DataNucleus 中。BoneCP 特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX 支持;懒加载能力;支持 XML 和属性文件配置方式;较好的 Java 代码组织,100% 单元测试分支代码覆盖率;代码 40KB 左右。
Druid:Druid 是 Java 语言中最好的数据库连接池,Druid 能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid 仍能够保持 100% 正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid 是一个开源项目,源码托管在 github 上。
Reference
- 主流 Java 数据库连接池比较及前瞻 - http://blog.didispace.com/java-datasource-pool-compare/
- 数据库连接池技术详解 - https://juejin.im/post/5b7944c6e51d4538c86cf195
- Day 9. Using JDBC to Connect to a Database - https://ejbvn.wordpress.com/category/week-2-entity-beans-and-message-driven-beans/day-09-using-jdbc-to-connect-to-a-database/
- Glassfish - How to setup mysql JDBC connection pool in Glassfish admin console - https://www.youtube.com/watch?v=5v5h1ZkfcFU
- Chapter 7 Connection Pooling with Connector/J - https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html
- A Simple Guide to Connection Pooling in Java - https://www.baeldung.com/java-connection-pooling
- Connection Pooling - https://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html
- Database Connection Pooling with Java - https://devcenter.heroku.com/articles/database-connection-pooling-with-java
- What is database pooling? - https://stackoverflow.com/questions/4041114/what-is-database-pooling