Java的数据库连接性能对比
JDBC:
- jdbc - 全名是 Java data base connectivity;翻译为 Java数据库连接
- 它是一个面向对象的程序接口(API);可以通过它访问到各类的 关系型数据库[注意:关系型数据库]
- 它不属于某一个数据库的接口,而是可以用于定义程序与数据库连接规范,通过一整套接口,由各个不同的数据库厂商去完成所对应的实现类,由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。
- Druid是阿里开源的连接池,可以说是Java语言中最好的数据库连接池.Druid能够提供**强大的日志监控和扩展功能,是为监控而生**的数据库连接池!【主要是监控DB池连接和SQL的执行情况】
- Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
- Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便
- 简单SQL语句执行耗时10微秒以内,复杂SQL耗时30微秒
- 通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。
- 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.) |
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md2:https://developer.aliyun.com/article/1542776