天天看点

Spring Boot 使用Druid连接池

1、在pom.xml下<dependencies>添加项目依赖:

    <dependency>

        <groupId>com.alibaba</groupId>

        <artifactId>druid-spring-boot-starter</artifactId>

        <version>1.1.22</version>

    </dependency>

2、在application.properties文件里添加:

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.thymeleaf.content-type=text/html

#关闭 Thymeleaf 的缓存开发过程中无需重启

spring.thymeleaf.cache=false

#设置thymeleaf页面的编码

spring.thymeleaf.encoding=UTF-8

spring.thymeleaf.mode=HTML

#设置thymeleaf页面的后缀

spring.thymeleaf.suffix=.html

# 定位模板的目录

spring.thymeleaf.prefix=classpath:/templates/

# 初始化大小,最小,最大

spring.datasource.initialSize=1

spring.datasource.minIdle=3

spring.datasource.maxActive=20

# 配置获取连接等待超时的时间

spring.datasource.maxWait=60000

# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

spring.datasource.timeBetweenEvictionRunsMillis=60000

# 配置一个连接在池中最小生存的时间,单位是毫秒

spring.datasource.minEvictableIdleTimeMillis=30000

spring.datasource.validationQuery=select 'x'

spring.datasource.testWhileIdle=true

spring.datasource.testOnBorrow=false

spring.datasource.testOnReturn=false

# 打开PSCache,并且指定每个连接上PSCache的大小

spring.datasource.poolPreparedStatements=true

spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙

spring.datasource.filters=stat,wall,slf4j

# 通过connectProperties属性来打开mergeSql功能;慢SQL记录

spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置

# 是否启用StatViewServlet监控页面,默认值为false考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全

spring.datasource.druid.stat-view-servlet.enabled=true 

spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*

## 禁止手动重置监控数据

spring.datasource.druid.stat-view-servlet.reset-enable=false

mybatis.mapper-locations=classpath:mapper/*.xml

3、创建DruidConfiguration配置类:

package com.example.testssm.config;

import com.alibaba.druid.pool.DruidDataSource;

import com.alibaba.druid.support.http.StatViewServlet;

import com.alibaba.druid.support.http.WebStatFilter;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.boot.context.properties.ConfigurationProperties;

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 javax.sql.DataSource;

import java.sql.SQLException;

@Configuration

public class DruidConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

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

    @Bean

    public ServletRegistrationBean druidServlet() {

        logger.info("Init Druid Servlet Configuration ");

        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

        // IP白名单 (没有配置或者为空,则允许所有访问)

        servletRegistrationBean.addInitParameter("allow", "");

        // IP黑名单(共同存在时,deny优先于allow)

        //servletRegistrationBean.addInitParameter("deny", "192.168.1.100");

        //控制台管理用户

        servletRegistrationBean.addInitParameter("loginUsername", "admin");

        servletRegistrationBean.addInitParameter("loginPassword", "123456");

        //是否能够重置数据 禁用HTML页面上的“Reset All”功能

        servletRegistrationBean.addInitParameter("resetEnable", "false");

        return servletRegistrationBean;

    }

    @Bean

    public FilterRegistrationBean filterRegistrationBean() {

        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

        filterRegistrationBean.addUrlPatterns("/*");

        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico, /druid/*");

        return filterRegistrationBean;

    }

    @ConfigurationProperties(prefix = DB_PREFIX)

    class IDataSourceProperties {

        private String url;

        private String username;

        private String password;

        private String driverClassName;

        private int initialSize;

        private int minIdle;

        private int maxActive;

        private int maxWait;

        private int timeBetweenEvictionRunsMillis;

        private int minEvictableIdleTimeMillis;

        private String validationQuery;

        private boolean testWhileIdle;

        private boolean testOnBorrow;

        private boolean testOnReturn;

        private boolean poolPreparedStatements;

        private int maxPoolPreparedStatementPerConnectionSize;

        private String filters;

        private String connectionProperties;

        @Bean

        public DataSource dataSource() {

            DruidDataSource datasource = new DruidDataSource();

            datasource.setUrl(url);

            datasource.setUsername(username);

            datasource.setPassword(password);

            datasource.setDriverClassName(driverClassName);

            //configuration

            datasource.setInitialSize(initialSize);

            datasource.setMinIdle(minIdle);

            datasource.setMaxActive(maxActive);

            datasource.setMaxWait(maxWait);

            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);

            datasource.setValidationQuery(validationQuery);

            datasource.setTestWhileIdle(testWhileIdle);

            datasource.setTestOnBorrow(testOnBorrow);

            datasource.setTestOnReturn(testOnReturn);

            datasource.setPoolPreparedStatements(poolPreparedStatements);

            datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

            try {

                datasource.setFilters(filters);

            } catch (SQLException e) {

                System.err.println("druid configuration initialization filter: " + e);

            }

            datasource.setConnectionProperties(connectionProperties);

            return datasource;

        }

        public String getUrl() {

            return url;

        }

        public void setUrl(String url) {

            this.url = url;

        }

        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 getDriverClassName() {

            return driverClassName;

        }

        public void setDriverClassName(String driverClassName) {

            this.driverClassName = driverClassName;

        }

        public int getInitialSize() {

            return initialSize;

        }

        public void setInitialSize(int initialSize) {

            this.initialSize = initialSize;

        }

        public int getMinIdle() {

            return minIdle;

        }

        public void setMinIdle(int minIdle) {

            this.minIdle = minIdle;

        }

        public int getMaxActive() {

            return maxActive;

        }

        public void setMaxActive(int maxActive) {

            this.maxActive = maxActive;

        }

        public int getMaxWait() {

            return maxWait;

        }

        public void setMaxWait(int maxWait) {

            this.maxWait = maxWait;

        }

        public int getTimeBetweenEvictionRunsMillis() {

            return timeBetweenEvictionRunsMillis;

        }

        public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {

            this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;

        }

        public int getMinEvictableIdleTimeMillis() {

            return minEvictableIdleTimeMillis;

        }

        public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {

            this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;

        }

        public String getValidationQuery() {

            return validationQuery;

        }

        public void setValidationQuery(String validationQuery) {

            this.validationQuery = validationQuery;

        }

        public boolean isTestWhileIdle() {

            return testWhileIdle;

        }

        public void setTestWhileIdle(boolean testWhileIdle) {

            this.testWhileIdle = testWhileIdle;

        }

        public boolean isTestOnBorrow() {

            return testOnBorrow;

        }

        public void setTestOnBorrow(boolean testOnBorrow) {

            this.testOnBorrow = testOnBorrow;

        }

        public boolean isTestOnReturn() {

            return testOnReturn;

        }

        public void setTestOnReturn(boolean testOnReturn) {

            this.testOnReturn = testOnReturn;

        }

        public boolean isPoolPreparedStatements() {

            return poolPreparedStatements;

        }

        public void setPoolPreparedStatements(boolean poolPreparedStatements) {

            this.poolPreparedStatements = poolPreparedStatements;

        }

        public int getMaxPoolPreparedStatementPerConnectionSize() {

            return maxPoolPreparedStatementPerConnectionSize;

        }

        public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {

            this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;

        }

        public String getFilters() {

            return filters;

        }

        public void setFilters(String filters) {

            this.filters = filters;

        }

        public String getConnectionProperties() {

            return connectionProperties;

        }

        public void setConnectionProperties(String connectionProperties) {

            this.connectionProperties = connectionProperties;

        }

    }

}

4、获取Druid的监控数据以JSON的形式暴露出去

    @RestController

    public class DruidStatController {

        @GetMapping("/druid/stat")

        public Object druidStat(){

            // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。

            return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();

        }

    }

5、Druid Monitor Web UI 地址:

访问:http://localhost:8080/druid/   登录名:admin   密码:123456