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

1,648 阅读5分钟

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

连接池的作用

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

Java数据库连接JDBC

  • jdbc就是Java数据库链接,原名Java data base connectivity
  • 它是一个面向对象的程序接口(API);可以通过它访问到各类的 关系型数据库[注意:关系型数据库]
  • 它不属于某一个数据库的接口,而是可以用于定义程序与数据库连接规范,通过一整套接口,由各个不同的数据库厂商去完成所对应的实现类,由sun公司提出!

加载步骤

  • 类加载
  • 获取连接
  • 书写SQL
  • 执行语句
  • 处理结果集

数据源

数据源定义

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

数据源和数据库连接的组件

数据源建立多个数据库连接,这些数据库连接会保存在数据库连接池中,当需要访问数据库时,只需要从数据库连接池中获取空闲的数据库连接,当程序访问数据库结束时,数据库连接会放回数据库连接池中。

常用的数据库连接池技术

  • druid 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分析语义实现的
  • Proxool

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

  • C3P0 c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

    • hibernate开发组推荐使用c3p0

c3p0 DBCP 区别

  • c3p0有自动回收空闲连接功能,而DBCP没有自动回收空闲连接的功能
  • 二者主要是对于数据连接的处理方式不同 c3p0提供最大空闲时间,当连接超过最大空闲连接时间时,当前连接就会被断掉,DBCP提供了最大连接数,当连接数超过最大连接数时,所有连接都会被断开. c3p0底层运行机制,所引类ComboPooledDataSource,ComboPooledDataSource会从pool里获取到的connection,而这个是connection的根本应该是proxy包装的connection,会对connection的释放或者重用,是pool的管理责任:初始化池大小,维护池的大小。 DBCP底层运行机制,DBCP采用数据源的方式获取连接,进行管理,dbcp中的BasicDataSourceFactory类实现了DataSource接口,自然可以获取到数据库连接,BasicDataSourceFactory中有三种方法:getOjectInstance、createDataSource以及getProperties 通常情况,采用的是createDataSource方法读取数据库连接参数,连接事务参数 数据池连接参数等。 evernotecid://B6BAE130-0783-41B3-BBAE-5FEC726A189C/appyinxiangcom/26622872/ENResource/p150

连接有效性检测

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

超时连接关闭设置

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