5 Java 数据库连接池介绍--Druid 介绍

Druid 连接池是阿里巴巴开源的数据库连接池项目,Druid 为监控而生,内置强大的监控功能,监控特性不影响性能,官网地址为:https://github.com/alibaba/druid/wiki/Druid%E8%BF%9E%E6%8E%A5%E6%B1%A0%E4%BB%8B%E7%BB%8D;本文主要介绍 Druid 的基本使用,文中使用到的软件版本:Java 1.8.0_191、Druid 1.2.8、Spring Boot 2.3.12.RELEASE 。
1、配置参数Druid 连接池的配置参数兼容 DBCP,个别配置的语意有所区别 。
配置缺省值说明name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来 。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this) 。配置此属性版本至少为 1.0.5,低于该版本设置 name 会出错 。
url 连接数据库的 urlusername 连接数据库的用户名password 连接数据库的密码 。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter 。
driverClassName根据url自动识别这一项可配可不配,如果不配置 Druid 会根据 url 自动识别 dbType,然后选择相应的 driverClassNameinitialSize0初始化时建立物理连接的个数 。初始化发生在显示调用 init 方法,或者第一次 getConnection 时maxActive8最大连接池数量maxIdle8已经不再使用,配置了也没效果minIdle 最小连接池数量maxWait 获取连接时最大等待时间,单位毫秒 。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock 属性为 true 使用非公平锁 。poolPreparedStatementsfalse是否缓存 preparedStatement,也就是 PSCache 。PSCache 对支持游标的数据库性能提升巨大,比如说 oracle 。在 mysql 下建议关闭 。maxPoolPreparedStatementPerConnectionSize-1要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 自动触发修改为 true 。在 Druid 中,不会存在 Oracle下 PSCache 占用内存过多的问题,可以把这个数值配置大一些,比如说 100validationQuery 用来检测连接是否有效的 sql,要求是一个查询语句,常用select 'x' 。如果 validationQuery 为 null,testOnBorrow、testOnReturn、testWhileIdle 都不会起作用 。validationQueryTimeout 单位:秒,检测连接是否有效的超时时间 。底层调用 jdbc Statement对象的 void setQueryTimeout(int seconds) 方法testOnBorrowtrue申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能 。testOnReturnfalse归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能 。testWhileIdlefalse建议配置为 true,不影响性能,并且保证安全性 。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行validationQuery 检测连接是否有效 。keepAlivefalse
(1.0.28)连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作 。timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义:
1) Destroy 线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接 。
2) testWhileIdle 的判断依据,详细看 testWhileIdle 属性的说明numTestsPerEvictionRun30分钟(1.0.14)不再使用,一个 DruidDataSource 只支持一个 EvictionRunminEvictableIdleTimeMillis 连接保持空闲而不被驱逐的最小时间connectionInitSqls 物理连接初始化的时候执行的 sqlexceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的 filter:stat
日志用的 filter:log4j
防御 sql 注入的 filter:wallproxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了 filters 和 proxyFilters,是组合关系,并非替换关系2、使用2.1、直接使用2.1.1、引入依赖<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>2.1.2、使用例子package com.abc.demo.general.dbpool;import com.alibaba.druid.pool.DruidDataSource;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DruidCase {public static void main(String[] args) {DruidDataSource druidDataSource = new DruidDataSource();Connection connection = null;try {druidDataSource.setName("测试连接池");druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");druidDataSource.setUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");druidDataSource.setUsername("root");druidDataSource.setPassword("123456");druidDataSource.setInitialSize(2);druidDataSource.setMinIdle(2);druidDataSource.setMaxActive(5);druidDataSource.setValidationQuery("select 1");druidDataSource.setTestWhileIdle(true);druidDataSource.setTestOnBorrow(true);druidDataSource.setTestOnReturn(false);druidDataSource.setMaxWait(6000);druidDataSource.setFilters("slf4j");connection = druidDataSource.getConnection();Statement st = connection.createStatement();ResultSet rs = st.executeQuery("select version()");if (rs.next()) {System.out.println(rs.getString(1));}} catch (SQLException e) {e.printStackTrace();} finally {close(connection);}//实际使用中一般是在应用启动时初始化数据源,应用从数据源中获取连接;并不会关闭数据源 。druidDataSource.close();}private static void close(Connection connection) {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}2.2、在 SpringBoot 中使用2.1.1、引入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath /></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>2.1.2、单数据源application.yml 配置:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 2min-idle: 2max-active: 5validation-query: select 1test-while-idle: truetest-on-borrow: truetest-on-return: falsemax-wait: 6000filter: slf4j使用:
@Autowiredprivate DataSource dataSource;2.1.3、多数据源application.yml 配置:
spring:datasource:druid:db1:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://10.140.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123456initial-size: 2min-idle: 2max-active: 5validation-query: select 1test-while-idle: truetest-on-borrow: truetest-on-return: falsemax-wait: 6000filter: slf4jdb2:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://10.40.9.12:3306/mydb?useUnicode=true&characterEncoding=UTF-8username: rootpassword: 123456initial-size: 2min-idle: 2max-active: 5validation-query: select 1test-while-idle: truetest-on-borrow: truetest-on-return: falsemax-wait: 6000filter: slf4j【5 Java 数据库连接池介绍--Druid 介绍】数据源配置类:
package com.abc.demo.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configurationpublic class DataSourceConfig {@Primary@Bean("dataSource1")@ConfigurationProperties("spring.datasource.druid.db1")public DataSource dataSourceOne(){return DruidDataSourceBuilder.create().build();}@Bean("dataSource2")@ConfigurationProperties("spring.datasource.druid.db2")public DataSource dataSourceTwo(){return DruidDataSourceBuilder.create().build();}}使用:
@Autowired@Qualifier("dataSource1")private DataSource dataSource1;@Autowired@Qualifier("dataSource2")private DataSource dataSource2;2.1.4、开启监控功能Druid 内置了一些监控,Spring Boot 环境下通过少量配置就可开启这些功能 。
application.yml 配置:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8username: rootpassword: InsYR0ot187!type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 2min-idle: 2max-active: 5validation-query: select 1test-while-idle: truetest-on-borrow: truetest-on-return: falsemax-wait: 6000filter: slf4j,stat,wall #启用日志、监控统计、防火墙功能web-stat-filter:#web监控配置enabled: truestat-view-servlet:#监控页面配置enabled: trueurl-pattern: /druid/*监控页面:

5 Java 数据库连接池介绍--Druid 介绍

文章插图
Spring Boot 中集成 Druid 的详细说明可以参考官网文档:https://hub.fastgit.org/alibaba/druid/tree/master/druid-spring-boot-starter