网络编程
位置:首页>> 网络编程>> 数据库>> Java 数据库连接池Druid 的介绍

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
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用 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 占用内存过多的问题,可以把这个数值配置大一些,比如说 100
validationQuery 用来检测连接是否有效的 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 只支持一个 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/*

监控页面:

Java 数据库连接池Druid 的介绍

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

来源:https://www.cnblogs.com/wuyongyin/p/15527920.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com