Java 数据库连接池Druid 的介绍
作者:咏吟 发布时间:2024-01-14 10:47:42
标签:Java,数据库,连接池,Druid
前言:
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
来源:https://www.cnblogs.com/wuyongyin/p/15527920.html


猜你喜欢
- 目录1、连接MongoDB2、指定(切换)数据库3、指定(切换)集合4、插入数据5、查询数据6、统计查询7、结果排序8、偏移9、更新数据10
- 一、安装Docker安装环境:系统:CentOS Linux7 x86_64安装脚本wget -qO- https://get.docker
- 函数的作用域python中的作用域分4种情况:L:local,局部作用域,即函数中定义的变量;E:enclosing,嵌套的父级函数的局部作
- 废话不多说,直接上代码吧!# 矩阵操作# 将矩阵拉成向量import numpy as npx = np.arange(10).reshap
- 日前,Mozilla 的 Arun Ranganathan 向 W3C 提交了一个草案,旨在推出一个 JavaScript API,让 Ja
- 1.字符强转一切如果是字符串进行强制转换, 仅仅就是在原数据类型的两边套上引号2.list : 强制转换成列表""&qu
- /* 建立数据表 */ create table td_base_data( id int(10) not null auto_increm
- 1. 在终端执行时设置使用哪些GPU(两种方式)(1) 如下(export 语句执行一次就行了,以后再运行代码不用执行)(2) 如下2. 代
- mysql脏页由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,
- 本文介绍了mint-ui在vue中的使用示例,分享给大家,具体如下:首先放上 mint-ui中文文档近来在使用mint-ui,发现部分插件在
- 遇到的问题:用户批量导入数据1000条,导入不成功的问题,提示查询不到商品资料。这个场景需要依靠批量的数据,每次测试的时候需要手动生成批量的
- nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=
- 多线程-共享全局变量#coding=utf-8from threading import Threadimport timeg_num =
- -crop参数是从一个图片截取一个指定区域的子图片.格式如下:convert -crop widthxheight{+-
- 一套javascript摇奖程序,随机6+1选号码,类似游戏彩票摇奖效果,实时滚动。截图:<style>.inp{ width:
- Python中的单元测试我们先来回顾一下Python中的单元测试方法。下面是一个 Python的单元测试简单的例子:假如我们开发
- 一个站点成功与否,不是在于所用的程序语言是PHP还是ASP,也不在于用BLOG建站或是CMS建站,内容和专业很重要。博客很好起步,CMS体系
- 在Web标准中的页面布局是使用Div配合CSS来实现的。这其中最常用到的就是使整个页面水平居中的效果,这是在页面布局中基本,也是最应该首先掌
- WAP站点,这似乎是一个有点落伍的东西。在诞生之初,它很简陋,只能通过一个叫WML的标记语言来搭建没有任何美感的文字+链接页面。而今,绝大部
- 目录 一个简单的实现使用BSF(宽度优先搜索)进行实现使用DFA(Deterministic Finite Automaton)进