文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java 数据库连接池Druid 的介绍

2024-04-02 19:55

关注

前言:

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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯