我用的是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、完毕