java数据库连接池之DBCP、C3P0、tomcat jdbc pool、hikari和Druid

杀马特。学长 韩版系。学妹 提交于 2020-03-08 20:35:59

 

我用的是springboot2.x整合如下连接池:

一、DBCP连接池(已过时,不推荐使用)

Tomcat 在 7.0 以前版本使用 commons-dbcp 做连接池。

DBCP缺点如下:

1、dbcp 是单线程的,为了保证线程安全会锁整个连接池

2、dbcp没有自动回收空闲连接的功能
3、dbcp 性能不佳
4、dbcp 使用静态接口,在 JDK 1.6 编译有问题
5、dbcp 发展滞后

dbcp一个线程:负责心跳,最小连接数维持,最大空闲时间和防连接泄露。

整合步骤:

1、引入pom

<!-- dbcp数据库连接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

2、配置文件添加

#必须参数
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.commons.dbcp.BasicDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sumengnan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=root
#重要参数
spring.datasource.dbcp.initialSize=3
spring.datasource.dbcp.maxActive=10
spring.datasource.dbcp.maxWait=30000
spring.datasource.dbcp.maxIdle=10
spring.datasource.dbcp.minIdle=2

3、启动类添加:

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource.dbcp")
	DataSource dataSource(DataSourceProperties properties) {
		return properties.initializeDataSourceBuilder().build();
	}

4、完毕。

5、如果没有整合orm框架,则继续在启动类构建一个JdbcTemplate

	@Bean
	public JdbcTemplate jdbcTemplate(DataSource dataSource){
		return new JdbcTemplate(dataSource); 
	}

6、注入JdbcTemplate 实例后,使用jdbcTemplate.queryForMap()就可以了(查询)

 

二、C3P0(单线程,不推荐使用)

它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

但是它是单线程的,在高并发的环境下性能会降低。

c3p0四个线程;三个helperThread (pollerThread),一个定时AdminTaskTimer(DeadlockDetector)。

整合步骤:

1、引入pom依赖

<!-- c3p0 数据源依赖 -->
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>

2、 配置文件添加

#配置c3p0的数据池,必须参数
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sumengnan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=root

#重要参数
#配置最小连接池数据
spring.datasource.c3p0.minPoolSize=2
#配置最大连接数
spring.datasource.c3p0.maxPoolSize=10
#最大空闲时间
spring.datasource.c3p0.maxIdleTime=1800000
#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数,每次增加3个连接
spring.datasource.c3p0.acquireIncrement=3
#最大sql语句
spring.datasource.c3p0.maxStatements=1000
#初始化连接池数
spring.datasource.c3p0.initialPoolSize=3
spring.datasource.c3p0.idleConnectionTestPeriod=60
spring.datasource.c3p0.acquireRetryAttempts=30
spring.datasource.c3p0.acquireRetryDelay=1000
spring.datasource.c3p0.breakAfterAcquireFailure=false
spring.datasource.c3p0.testConnectionOnCheckout=false

3、启动类添加:

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource.c3p0")
	DataSource dataSource(DataSourceProperties properties) {
		return properties.initializeDataSourceBuilder().build();
	}

4、完毕

 

三、tomcat jdbc pool(性能好,推荐)

Tomcat 从 7.0 开始引入一个新的模块:Tomcat jdbc pool,在tomcat-jdbc包下

springboot1.x默认是Tomcat jdbc pool,优先级>hikari>dbcp>dbcp2,如下图:

在springboot1.x中spring-boot-starter-data-jpa依赖spring-boot-starter-jdbc依赖tomcat-jdbc包

优点:

1、tomcat jdbc pool 近乎兼容 dbcp ,性能更高
2、异步方式获取连接
3、tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架
4、使用 javax.sql.PooledConnection 接口获取连接
5、支持高并发应用环境
6、超简单,核心文件只有8个,比 c3p0 还少
7、更好的空闲连接处理机制
8、支持 JMX
9、支持 XA Connection

Tomcat Jdbc池官网文档地址:https : //tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

整合步骤:

1、引入pom

		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jdbc</artifactId>
                        <version>8.5.4</version>
		</dependency>

2、配置文件添加

#必须配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sumengnan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=root


#一、基本连接配置####################################################
#连接池初始创建的连接数量
spring.datasource.tomcat.initial-size=10
#最大连接数
spring.datasource.tomcat.max-active=10
#最大等待时间(在没有连接可用的情况下)
spring.datasource.tomcat.max-wait=30000
#二、闲置连接处理###################################################
#最大空闲数
spring.datasource.tomcat.max-idle=10
#最小空闲数
spring.datasource.tomcat.min-idle=2
#是否检查空闲连接的有效性
spring.datasource.tomcat.test-while-idle=true
#空闲连接回收线程运行的间隔时间
spring.datasource.tomcat.time-between-eviction-runs-millis=600000
#连接闲置超过该时间则被认为可以关闭
spring.datasource.tomcat.min-evictable-idle-time-millis=1800000
#三、验证连接处理#######################################################
#连接首次被创建时是否进行验证
spring.datasource.tomcat.test-on-connect=true
#从连接池获取连接时,是否验证连接的有效性(可以设置validation-interval防止频繁验证)
spring.datasource.tomcat.test-on-borrow=true
#连接前验证有效性的时间间隔(在该时间内被验证过的连接不会被重复验证)
spring.datasource.tomcat.validation-interval=5000
#连接归还时是否进行验证
spring.datasource.tomcat.test-on-return=true
#连接归还时,如果连接超过该时间则会被关闭
spring.datasource.tomcat.max-age=0
#执行检查连接的有效性的简单sql语句
spring.datasource.tomcat.validation-query=SELECT COUNT(*) FROM  MAX_USER
#执行检查连接的有效性的简单sql语句的超时时间
spring.datasource.tomcat.validation-query-timeout=5
#四、泄露连接处理###########################################################
#是否关闭泄露的连接
spring.datasource.tomcat.remove-abandoned=true
#当连接超过该时间没有归还, 则关闭泄露的连接(连接一直使用,超过此时间时关闭)
spring.datasource.tomcat.remove-abandoned-timeout=60
#是否打印相关日志
spring.datasource.tomcat.log-abandoned=true
#当连接超过该时间没有归还, 则认为可能泄露. 如果 logAbandoned 开启, 会输出相应日志
spring.datasource.tomcat.suspect-timeout=30

3、完毕

 

四、hikari(性能最好,推荐)

hikari非常强大,高效,并且号称“史上最快连接池”。hikariCP的高性能得益于最大限度的避免锁竞争。官方图如下:

 

在springboot2.0之后,采用的默认数据库连接池就是Hikari。优先级>tomcat jdbc pool>dbcp2,如图:

hikariCP: 三个线程: 其中一个为定时线程,解决最大空闲时间。两个为新建连接和关闭连接。 均是连接池,空闲5s,线程便会关闭。

整合步骤

1、如果不是springboot2.x,则需要引入pom


<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.2</version>
</dependency>

2、配置文件添加

#必须参数
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sumengnan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=root
#重要参数
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

3、完毕 

 

五、Druid(功能强大,阿里出品,极力推荐)

Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。

功能:

1、可以监控数据库访问性能。

2、性能出众

3、数据库密码加密。可以不用直接把数据库密码写在配置文件中。

4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

druid: 两个线程: 其中一个负责异步创建。一个负责最小连接数的维持。 其中心跳是通过获取连接,来判定是否小于心跳间隔。

整合步骤

1、引入pom

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

 

2、配置文件添加

#必须配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/sumengnan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=root

@重要配置
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters[0]=stat
spring.datasource.filters[1]=wall
spring.datasource.filters[2]=log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.useGlobalDataSourceStat=true
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

 

3、创建一个config类

package com.sumengnan.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return  new DruidDataSource();
    }

    //配置Druid的监控
    //1、配置一个管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String,String> initParams = new HashMap<>();

        initParams.put("loginUsername","admin");
        initParams.put("loginPassword","123");
        initParams.put("allow","");//默认就是允许所有访问
        
        bean.setInitParameters(initParams);
        return bean;
    }


    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initParams);

        bean.setUrlPatterns(Arrays.asList("/*"));

        return  bean;
    }
}

 

4、完毕

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!