spring boot整合Druid连接池

Posted 小小本科生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot整合Druid连接池相关的知识,希望对你有一定的参考价值。

        Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,据说是目前最好的连接池。

1.引入maven依赖

        <!--druid数据库连接池-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

当然,jdbc和数据库(如:mysql)的驱动依赖是必不可少的。

2.配置druid数据源及连接池基本信息,这里我更倾向于使用yml配置方式

spring:
  datasource:
    url: jdbc:mysql://116.62.50.7:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
    password:
    username:
    # 我这里用的mysql是8.0以上,用哪个驱动依数据库版本而定
    driver-class-name: com.mysql.cj.jdbc.Driver
    platform: mysql
    # 下面为连接池的补充设置,应用到上面所有数据源中
    type: com.alibaba.druid.pool.DruidDataSource
    # 初始化大小,最小,最大
    initialSize: 1
    minIdle: 3
    maxActive: 20
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 30000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打开PSCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,slf4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    # 合并多个DruidDataSource的监控数据
    #useGlobalDataSourceStat: true

当然,因为是线上的数据库,用户名和密码我就不贴了。如果你打算参考我的配置,在使用时请将中文注释删除,因为可能会因为编码问题导致此配置文件不可用。

3.写监控配置类

        druid的监控是使用过滤链来实现的。需要写一个Filter配置类才能使用,我们下面基于WebStatFilter来写一个配置类

package com.bupt.dao.config;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * druid监控配置类
 * @Author huang xin
 * @Date 2020/1/9 12:02
 * @Version 1.0
 */
@Configuration
public class DruidConfiguration 
    private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

    @Bean
    public ServletRegistrationBean druidServlet() 
        logger.info("init Druid Servlet Configuration ");
        // Spring boot 默认是不支持 JSP 的,所以想用使用 Servlet 功能,就必须要借用 Spring Boot 提供的 ServletRegistrationBean 接口
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        // IP白名单
//        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
        // IP黑名单(共同存在时,deny优先于allow)
//        servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
        //控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "admin");
        //是否能够重置数据 禁用html页面上的“Reset All”功能
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    

    /**
     * 使用WebStatFilter过滤器配置druid的url统计
     * @return
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean() 
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        // 排除对以下url的统计
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    

    /**
     * @Bean 声明其为Bean实例
     * @Primary 在同样的DataSource中,首先使用被标注的DataSource
     * @return
     */
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource datasource()
        return DataSourceBuilder.create().type(com.alibaba.druid.pool.DruidDataSource.class).build();
    


4.访问druid监测页

启动项目,访问

http://localhost:8080/druid/index.html

因为我的项目没有任何前缀,所以如上述方式访问。如果你配置了前缀,比如/test

server.servlet.context-path=/test

则如下方式访问

http://localhost:8080/test/druid/index.html

因为我们在配置类中设定用户名和密码都是admin,所以登陆的时候就以这个用户名和密码登陆

监控页如下

:如果想再整合mybatis,只要在yml底部加mybatis配置

#Mybatis
mybatis:
  #加载mybatis主要配置类
  config-location: classpath:/mybatis-config.xml
  #加载mapper配置类
  mapper-locations: classpath:/mapper/*.xml
  #加载mapper实体类
  type-aliases-package: com.bupt.testboot.entity

在DruidConfiguration.java配置类中添加如下配置

    /**
     * 解决问题:service中无法找到 mapper bean
     * 默认情况下 mybatis 只读取同一个工程里的 Mapper Bean
     * Mapper接口所在包名,Spring会自动查找其下的Mapper
     * @return mapperScannerConfigurer
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() 
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("**.mapper");
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        return mapperScannerConfigurer;
    

(1)从yml中可以看到我们将mybatis目录配置在classpath(也就是resources)下面了

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org/DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--使用jdbc的getGeneratedKeys获取数据库自增主键值-->
        <setting name="useGeneratedKeys" value="true"/>
        <!--使用列标签换列别名 默认:true-->
        <setting name="useColumnLabel" value="true"/>
        <!--开启驼峰命名转换:Tablecreate_Time->EntitycreateTime-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

(2)根据yml上的配置将mapper放在 classpath(resources)下的mapper文件夹下,比如我写了一个测试的UserDao的mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bupt.testboot.dao.UserDao">
    <select id="getUser" resultType="com.bupt.testboot.entity.User">
        select * from user;
    </select>
</mapper>

UserDao接口

package com.bupt.testboot.dao;

import com.bupt.testboot.entity.User;

import java.util.List;

public interface  UserDao 

    List<User> getUser();


 实体类

package com.bupt.testboot.entity;

public class User 
    private int id;
    private String username;
    private String password;
    private String photo;

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public String getPhoto() 
        return photo;
    

    public void setPhoto(String photo) 
        this.photo = photo;
    

    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                ", photo='" + photo + '\\'' +
                '';
    

最后一步,设置扫描我们的Dao,在DruidConfiguration类上添加@MapperScan注解

@Configuration
@MapperScan(value = "com.bupt.testboot.dao")
public class DruidConfiguration 
    private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

    private static final String DB_PREFIX = "spring.datasource";

 到此mybatis也集成进来了。

参考:https://blog.csdn.net/q_linchao/article/details/80693214

Druid常见问题解答:https://github.com/alibaba/druid/wiki/FAQ

如何在Spring Boot项目中继承Druid连接池和监控:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

以上是关于spring boot整合Druid连接池的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:Spring Boot整合Druid

Spring Boot 整合 Druid

Spring boot项目整合阿里巴巴druid数据库连接池,学了几年Java你这都还不懂?我儿子都知道了

springboot-2-整合myBatis及druid连接池

springboot-26-整合mybatis,druid连接池

spring boot 1.5.4 整合 druid(十三)