前言:
Druid 连接池是阿里巴巴开源的数据库连接池项目,Druid 为监控而生,内置强大的监控功能,监控特性不影响性能,官网地址为:https://github.com/alibaba/druid/wiki/,本文主要介绍 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 | 连接数据库的 url | |
username | 连接数据库的用户名 | |
password | 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。 |
|
driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置 Druid 会根据 url 自动识别 dbType,然后选择相应的 driverClassName |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用 init 方法,或者第一次 getConnection 时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock 属性为 true 使用非公平锁。 | |
poolPreparedStatements | false | 是否缓存 preparedStatement,也就是 PSCache。PSCache 对支持游标的数据库性能提升巨大,比如说 oracle。在 mysql 下建议关闭。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 自动触发修改为 true。在 Druid 中,不会存在 Oracle下 PSCache 占用内存过多的问题,可以把这个数值配置大一些,比如说 100 |
validationQuery | 用来检测连接是否有效的 sql,要求是一个查询语句,常用select 'x'。如果 validationQuery 为 null,testOnBorrow、testOnReturn、testWhileIdle 都不会起作用。 | |
validationQueryTimeout | 单位:秒,检测连接是否有效的超时时间。底层调用 jdbc Statement对象的 void setQueryTimeout(int seconds) 方法 | |
testOnBorrow | true | 申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | false | 归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。 |
testWhileIdle | false | 建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行validationQuery 检测连接是否有效。 |
keepAlive | false (1.0.28) |
连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。 |
timeBetweenEvictionRunsMillis | 1分钟(1.0.14) | 有两个含义: 1) Destroy 线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接。 2) testWhileIdle 的判断依据,详细看 testWhileIdle 属性的说明 |
numTestsPerEvictionRun | 30分钟(1.0.14) | 不再使用,一个 DruidDataSource 只支持一个 EvictionRun |
minEvictableIdleTimeMillis | 连接保持空闲而不被驱逐的最小时间 | |
connectionInitSqls | 物理连接初始化的时候执行的 sql | |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的 filter:stat 日志用的 filter:log4j 防御 sql 注入的 filter:wall |
|
proxyFilters | 类型是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.Driver
url: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 2
min-idle: 2
max-active: 5
validation-query: select 1
test-while-idle: true
test-on-borrow: true
test-on-return: false
max-wait: 6000
filter: slf4j
使用:
@Autowired
private DataSource dataSource;
2.1.3、多数据源
application.yml 配置:
spring:
datasource:
druid:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.140.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
initial-size: 2
min-idle: 2
max-active: 5
validation-query: select 1
test-while-idle: true
test-on-borrow: true
test-on-return: false
max-wait: 6000
filter: slf4j
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.40.9.12:3306/mydb?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
initial-size: 2
min-idle: 2
max-active: 5
validation-query: select 1
test-while-idle: true
test-on-borrow: true
test-on-return: false
max-wait: 6000
filter: slf4j
数据源配置类:
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;
@Configuration
public 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.Driver
url: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8
username: root
password: InsYR0ot187!
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 2
min-idle: 2
max-active: 5
validation-query: select 1
test-while-idle: true
test-on-borrow: true
test-on-return: false
max-wait: 6000
filter: slf4j,stat,wall #启用日志、监控统计、防火墙功能
web-stat-filter: #web监控配置
enabled: true
stat-view-servlet: #监控页面配置
enabled: true
url-pattern: /druid/*
监控页面:
Spring Boot
中集成 Druid 的详细说明可以参考官网文档:https://hub.fastgit.org/alibaba/druid/tree/master/druid-spring-boot-starter
到此这篇关于 Java 数据库连接池Druid 的介绍的文章就介绍到这了,更多相关 Java连接池Druid 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!