JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md1

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md

Java的数据库连接性能对比

JDBC:
  1. jdbc - 全名是 Java data base connectivity;翻译为 Java数据库连接
  2. 它是一个面向对象的程序接口(API);可以通过它访问到各类的 关系型数据库[注意:关系型数据库]
  1. 它不属于某一个数据库的接口,而是可以用于定义程序与数据库连接规范,通过一整套接口,由各个不同的数据库厂商去完成所对应的实现类,由sun公司提出!
步骤:
1. 类加载
2. 获取连接
3. 书写SQL
4. 执行语句
5. 处理结果集
为什么会有连接池的存在?

因为建立数据库连接是一个非常耗时、耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去,极大的提高了数据库连接的性能问题,节省了资源和时间。

数据源
什么是数据源

JDBC2.0 提供了javax.sql.DataSource接口,它负责建立与数据库的连接,当在应用程序中访问数据库时 不必编写连接数据库的代码,直接引用DataSource获取数据库的连接对象即可。用于获取操作数据Connection对象。

数据源与数据库连接池组件

数据源建立多个数据库连接,这些数据库连接会保存在数据库连接池中,当需要访问数据库时,只需要从数据库连接池中

获取空闲的数据库连接,当程序访问数据库结束时,数据库连接会放回数据库连接池中。

常用的数据库连接池技术:

C3P0、DBCP、Proxool和Druid

1. C3P0、DBCP和Druid是什么?
  • c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
  • hibernate开发组推荐使用c3p0;
  • c3p0所需jar:c3p0-0.9.2.1.jar mchange-commons-java-0.2.3.4.jar

DBCP是 apache 上的一个 java 连接池项目,是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP

dbcp所需jar:commons-dbcp.jar和commons-pool.jar

Druid是阿里巴巴出品的数据源,而且是淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。

  1. Druid是阿里开源的连接池,可以说是Java语言中最好的数据库连接池.Druid能够提供**强大的日志监控和扩展功能,是为监控而生**的数据库连接池!【主要是监控DB池连接和SQL的执行情况】
  2. Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
  3. Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便
  4. 简单SQL语句执行耗时10微秒以内,复杂SQL耗时30微秒
  5. 通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。
  6. Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。

在Maven中的依赖为:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
</dependency>
  • DRUID连接池使用的jar包:druid-1.0.9.jar
2. C3P0与DBCP的区别?
  • c3p0有自动回收空闲连接功能
    dbcp没有自动回收空闲连接功能
  • 两者主要是对数据连接的处理方式不同!
  • C3P0提供最大空闲时间,当连接超过最大空闲连接时间时,当前连接就会被断掉
  • DBCP提供了最大连接数,当连接数超过最大连接数时,所有连接都会被断开
3. C3P0的底层运行机制?

c3p0所引用的类是:ComboPooledDataSource

ComboPooledDataSource会从pool里获取到的connection,而这个是connection的根本应该是proxy包装的connection,会对connection的释放或者重用,是pool的管理责任:初始化池大小,维护池的大小

4. DBCP的底层运行机制?
  • dbcp可以采用数据源的方式进行获取连接,进行管理;
  • dbcp中的BasicDataSourceFactory类实现了DataSource接口,自然可以获取到数据库连接
  • BasicDataSourceFactory中有三种方法:getOjectInstance、createDataSource以及getProperties
  • 通常情况,采用的是createDataSource方法读取数据库连接参数连接事务参数 数据池连接参数等。

附表:


DBCP
c3p0 Druid
用户名 username user username
密码 password password password
URL url jdbcUrl jdbcUrl
驱动类名 driverClassName driverClass driverClassName
DBCP c3p0 Druid
最小连接数 minIdle(0) minPoolSize(3) minIdle(0)
初始化连接数 initialSize(0) initialPoolSize(3) initialSize(0)
最大连接数 maxTotal(8) maxPoolSize(15) maxActive(8)
最大等待时间 maxWaitMillis(毫秒) maxIdleTime(0秒) maxWait(毫秒)
DBCP c3p0 Druid
开启缓存功能 poolPreparedStatements maxStatements poolPreparedStatements
单个连接拥有的最大缓存数 maxOpenPrepared- Statements maxStatementsPer- Connection maxOpenPrepared- Statements

连接有效性检测设置:

连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某 个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制 (mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true, 可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了 保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。


DBCP
c3p0 Druid
申请连接检测 testOnBorrow testConnectionOnCheckin testOnBorrow
是否超时检测 testWhileIdle testWhileIdle
空闲时间 timeBetweenEvictionRunsMillis idleConnectionTestPeriod timeBetweenEvictionRunsMillis
校验用sql语句 validationQuery preferredTestQuery validationQuery
归还连接检测 testOnReturn testConnectionOnCheckout testOnReturn

超时连接关闭设置:

removeAbandoned参数,用来检测到当前使用的连接是否发生了连接泄露,所以在代码内部就假定如果一个连接建立连接的时间很长,则将其认定为泄露,继而强制将其关闭掉。

DBCP c3p0 Druid
是否超时关闭连接 removeAbandoned breakAfterAcquireFailure removeAbandoned
超时时间 removeAbandonedTimeout checkoutTimeout removeAbandonedTimeout
是否记录日志 logAbandoned logAbandoned


c3p0重连设置:

设置获取连接失败后,是否重新连接以及间隔时间。

DBCP c3p0 Druid
重连次数 acquireRetryAttempts
间隔时间 acquireRetryDelay

各个连接池的属性说明  DBCP 属性说明表

属性(Parameter) 默认值(Default) 描述(Description)
username 传递给JDBC驱动的用于建立连接的用户名(The connection username to be passed to our JDBC driver to establish a connection.)
password 传递给JDBC驱动的用于建立连接的密码(The connection password to be passed to our JDBC driver to establish a connection.)
url 传递给JDBC驱动的用于建立连接的URL(The connection URL to be passed to our JDBC driver to establish a connection.)
driverClassName 使用的JDBC驱动的完整有效的java 类名(The fully qualified Java class name of the JDBC driver to be used.)

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md2:https://developer.aliyun.com/article/1542776


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
缓存 监控 druid
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
14 0
|
12天前
|
SQL druid Java
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md2
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md
9 0
|
2月前
|
SQL Java 关系型数据库
MySQL之JDBC(二)
MySQL之JDBC(二)
42 0
|
2月前
|
关系型数据库 MySQL Java
MySQL之JDBC(一)
MySQL之JDBC
42 0
|
2月前
|
关系型数据库 MySQL Java
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
55 0
|
2月前
|
Java 关系型数据库 数据库连接
实时计算 Flink版操作报错之在使用JDBC连接MySQL数据库时遇到报错,识别不到jdbc了,怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
Java 关系型数据库 MySQL
JDBC实现往MySQL插入百万级数据
JDBC实现往MySQL插入百万级数据
|
2月前
|
SQL 关系型数据库 MySQL
Spring_jdbc数据连接池(mysql实现增、删、改、查)
Spring_jdbc数据连接池(mysql实现增、删、改、查)
29 0
|
1天前
|
Java 关系型数据库 MySQL
使用MySQL JDBC连接数据库
使用MySQL JDBC连接数据库
|
14天前
|
Java 关系型数据库 MySQL
JavaWeb基础第一章(MySQL数据库与JDBC)
JavaWeb基础第一章(MySQL数据库与JDBC)