Spring配置第三方连接池

Spring配置C3P0连接池

官网:http://www.mchange.com/projects/c3p0/

步骤:

  1. 导入c3p0的坐标
  2. 注册连接池(修改DataSource的class以及四个基本项)

实现:

  • 导入坐标
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
  • 配置数据源连接池
<!-- 配置C3P0数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="jdbc:mysql:///spring_jdbc" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="user" value="root" />
<property name="password" value="123456" />
</bean>
<!-- 管理JDBC模版 -->
<bean id="jdbcTemplete" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>

核心类:`com.mchange.v2.c3p0.ComboPooledDataSource

Spring配置Druid连接池

官网:http://druid.io/

步骤:

  1. 导入Druid坐标
  2. 修改DataSource的class(四个基本项)

实现:

  • 导入坐标

    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
    </dependency>
  • 配置数据源连接池

<!--注册dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/spring_day03"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>

Spring配置HikariCP连接池

官网:https://github.com/brettwooldridge/HikariCP

步骤:

  1. 添加HikariCP坐标
  2. 修改DataSource的class(四个基本项)

实现:

  • 导入HikariCP坐标

    <dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.1.0</version>
    </dependency>
  • 配置数据源连接池

     <!-- 配置HikariCP数据库连接池 -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="jdbc:mysql:///spring_jdbc" />
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="username" value="root" />
    <property name="password" value="123456" />
    </bean>

    核心类:com.zaxxer.hikari.HikariDataSource

    • 为什么HikariCP为什么越来越火?
      • 效率高
      • 一直在维护
      • SpringBoot2.0 现在已经把HikariCP作为默认的连接池了
  • 为什么HikariCP被号称为性能最好的Java数据库连接池?

    • 优化并精简字节码: HikariCP利用了一个第三方的Java字节码修改类库Javassist来生成委托实现动态代理

    • 优化代理和拦截器:减少代码,代码量越少。一般意味着运行效率越高、发生bug的可能性越低.

1540557295765

  • 自定义集合类型ConcurrentBag:ConcurrentBag的实现借鉴于C#中的同名类,是一个专门为连接池设计的lock-less集合,实现了比LinkedBlockingQueue、LinkedTransferQueue更好的并发性能。ConcurrentBag内部同时使用了ThreadLocal和CopyOnWriteArrayList来存储元素,其中CopyOnWriteArrayList是线程共享的。ConcurrentBag采用了queue-stealing的机制获取元素:首先尝试从ThreadLocal中获取属于当前线程的元素来避免锁竞争,如果没有可用元素则再次从共享的CopyOnWriteArrayList中获取。此外,ThreadLocal和CopyOnWriteArrayList在ConcurrentBag中都是成员变量,线程间不共享,避免了伪共享(false sharing)的发生。

    • 使用FastList替代ArrayList: FastList是一个List接口的精简实现,只实现了接口中必要的几个方法。JDK ArrayList每次调用get()方法时都会进行rangeCheck检查索引是否越界,FastList的实现中去除了这一检查,只要保证索引合法那么rangeCheck就成为了不必要的计算开销(当然开销极小)。