社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
数据库连接的建立是一种耗时、性能低、代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能。数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序需要访问数据库时,不再建立一个新的连接,而是从连接池中取出一个已建立的空闲连接,使用完毕后,程序将连接归还到连接池中,供其他请求使用,从而实现的资源的共享,连接的建立、断开都由连接池自身来管理。
昂贵的数据库连接资源得到重用;减少了数据库连接建立和释放的时间开销,提高了系统响应速度;统一的数据库连接管理,避免了连接资源的泄露。
系统初始化时创建连接池,程序操作数据库时从连接池中获取空闲连接,程序使用完毕将连接归还到连接池中,系统退出时,断开所有数据库连接并释放内存资源。
对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 。
功能 | dbcp | druid | c3p0 | tomcat-jdbc | HikariCP |
---|---|---|---|---|---|
是否支持PSCache | 是 | 是 | 是 | 否 | 否 |
监控 | jmx | jmx/log/http | jmx,log | jmx | jmx |
扩展性 | 弱 | 好 | 弱 | 弱 | 弱 |
sql拦截及解析 | 无 | 支持 | 无 | 无 | 无 |
代码 | 简单 | 中等 | 复杂 | 简单 | 简单 |
更新维护 | 否 | 是 | 否 | 否 | 是 |
特点 | 依赖于common-pool | 阿里开源,功能全面 | 历史久远,代码逻辑复杂,且不易维护 | 优化力度大,功能简单,起源于boneCP | |
连接池管理 | LinkedBlockingDeque | 数组、CopyOnWriteArrayList(COW) | 队列 | FairBlockingQueue | threadlocal+CopyOnWriteArrayList |
是否开源 | 是 | 是 | 是 | 是 | 是 |
CPU | Intel® Xeon® CPU E5-2430 v2 @ 2.50GHz,24core |
---|---|
msyql 版本 | 5.5.46 |
tomcat-jdbc 版本 | 8.0.28 |
HikariCP 版本 | 2.4.3 |
c3p0 版本 | 0.9.5 |
dbcp版本 | 2.0.1 |
druid版本 | 1.0.5 |
测试说明:
图形:
mock性能数据 (单位:ms)
5 | 20 | 50 | 100 | |
---|---|---|---|---|
tomcat-jdbc | 442 | 447 | 1,013 | 1,264 |
c3p0 | 4,480 | 5,527 | 7,449 | 10,725 |
dbcp | 676 | 689 | 867 | 1,292 |
hikari | 38 | 33 | 38 | 30 |
druid | 291 | 293 | 562 | 985 |
mysql性能数据 (单位:ms)
5 | 20 | 50 | 100 | |
---|---|---|---|---|
tomcat-jdbc | 436 | 453 | 1033 | 1291 |
c3p0 | 4378 | 5726 | 7975 | 10948 |
dbcp | 671 | 679 | 897 | 1380 |
hikari | 96 | 82 | 87 | 78 |
druid | 304 | 424 | 690 | 1130 |
2.查询一条语句性能测试
测试说明:
图形:
测试数据:
5 | 8 | 20 | 50 | 100 | |
---|---|---|---|---|---|
tomcat-jdbc | 2178 | 1495 | 1769 | 1818 | 1858 |
c3p0 | 3237 | 3451 | 4488 | 5994 | 7906 |
dbcp | 2816 | 1935 | 2097 | 2243 | 2280 |
hikari | 2299 | 1546 | 1682 | 1751 | 1772 |
druid | 2297 | 1551 | 1800 | 1977 | 2032 |
测试结果:
3:pscache性能对比
测试说明:
测试数据:
cache | 1,927 |
---|---|
not cache | 2,134 |
测试结果:
测试说明:
4: pscache详解
druid的连接池配置中有PreparedStatementCache的配置,该信息解决了sql语句可以被预编译,并且保存在PreparedStatement这个对象中,而这个对象的存储就在PreparedStatementCache,对于oracle可以绕过数据库编译,有很大的提升,但是对于mysql,没有那么明显。
这个值的设置不是越大越好,PSCache会占用jvm,占用量=连接数*PSCache设置的大小*每个PSCache占用的内存。
1:性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。
3:综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。
4:可开启prepareStatement缓存,对性能会有大概20%的提升。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!