SpringBoot数据库链接池Druid的配置及log4j:WARN的解决

2022年05月13日 阅读数:2
这篇文章主要向大家介绍SpringBoot数据库链接池Druid的配置及log4j:WARN的解决,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

目录css

前言html

1、导入相关依赖前端

2、在配置文件中对Druid数据源进行配置java

3、自定义Druid数据源配置mysql

4、进行监控 web

5、遇到的问题 spring


前言

数据库链接池负责分配、管理和释放数据库链接,它容许程序重复使用一个现有的链接,而不是再从新创建一个。释放空闲时间超过最大空闲时间的数据库链接来避免由于没有释放数据库链接而引发的数据库链接遗漏。这项技术能明显提升对数据库操做的性能。常见的数据库链接池有c3p0,druid,hikari,DBCP等。Hikari是一款很是强大,高效,而且号称“史上最快链接池”。而且在springboot2.0以后,采用的默认数据库链接池就是Hikari。Druid 是阿里巴巴开源平台上一个数据库链接池实现,结合了 C3P0、DBCP 等 数据库链接池的优势,同时加入了日志监控。sql

1、导入相关依赖

一、在导入相关依赖以前,能够经过在SpringBootDataApplicationTests里配置来查看SpringBoot默认的数据库链接池。会发现默认数据源是:class com.zaxxer.hikari.HikariDataSource数据库

package com.study;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootTest
class SpringBootDataApplicationTests {

	@Autowired
	DataSource dataSource;
	@Test
	void contextLoads() throws SQLException {
		//查看默认的数据源:class com.zaxxer.hikari.HikariDataSource
		System.out.println(dataSource.getClass());
		//得到数据库链接
		Connection connection = dataSource.getConnection();
		System.out.println(connection);
		//关闭
		connection.close();
	}

}

二、导入Druid和log4j依赖apache

<!-- druid,自然集成监控功能,能够监控数据库访问性能-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.2.8</version>
		</dependency>
		<!--log4j-->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

2、在配置文件中对Druid数据源进行配置

注:上面的数据库链接根据实际状况进行配置,博主用的是以前项目的mybatis数据库,Druid专有配置能够直接复制,通常不会有太大的变更。

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    #Spring Boot 默认是不注入这些属性值的,须要本身绑定
    #druid 数据源专有配置
    # 初始链接数
    initialSize: 5
    # 最小链接池数量和最大链接池数量
    minIdle: 5
    maxActive: 20
    # 配置获取链接等待超时的时间,单位为毫秒
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测须要关闭的空闲链接
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个链接在池中最小生存的时间
    minEvictableIdleTimeMillis: 300000
    # 配置检测链接是否有效
    validationQuery: SELECT 1 FROM DUAL
    #申请链接的时候检测,若是空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测链接是否有效。
    testWhileIdle: true
    #配置从链接池获取链接时,是否检查链接有效性,true每次都检查;false不检查。作了这个配置会下降性能。
    testOnBorrow: false
    #配置向链接池归还链接时,是否检查链接有效性,true每次都检查;false不检查。作了这个配置会下降性能。
    testOnReturn: false
    #打开PsCache
    poolPreparedStatements: true
    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防护sql注入
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

3、自定义Druid数据源配置

一、为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中

@Configuration
public class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

二、配置Druid数据源监控

注:loginUsername和loginPassword是固定的,而且由于SpringBoot内置Servlet容器,因此没有web.xml,要想用使用 Servlet 功能,就必需要借用 Spring Boot 提供的 ServletRegistrationBean 接口。@Bean注解用于告诉方法,产生一个Bean对象,而后这个Bean对象交给Spring管理。

    //后台监控功能
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //Druid后台帐号密码配置
        HashMap<String, String> initParameters = new HashMap<>();
        initParameters.put("loginUsername", "admin");
        initParameters.put("loginPassword", "123456");
        //容许谁能够访问,这里容许全部用户
        initParameters.put("allow", "");
        //禁止谁能访问 initParameters.put("deny","192.168.1.1");
        bean.setInitParameters(initParameters);//设置初始化参数
        return bean;
    }
    //配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        HashMap<String, String> initParameters = new HashMap<>();
        bean.setInitParameters(initParameters);
        //这些东西不进行统计
        initParameters.put("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return bean;
    }

能够查看StatViewServlet源码,发现Druid后台的地址为本地地址+/druid/index.html

 查看WebStatFilter源码,能够看见web监控的filter过滤器的相关配置其中就包括exclusions

 查看源码,能够看见InitParameters的参数类型为Map<String,String>,这就是为何进行Druid后台帐号密码配置时,要建立一个Map集合了。

4、进行监控 

一、先写好一些SQl语句,将数据库的数据用Json传递给前端

二、进入Druid的登陆界面,输入http://localhost:8080/druid/login.html

三、查看监控状况

5、遇到的问题 

发现执行时报下列错误:

log4j:WARN No appenders could be found for logger (druid.sql.Connection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

解决:导入log4j文件后,并无配置log4j属性文件

 配置log4j属性文件,应用于控制台便可,博主之前也发过log4j属性配置文件,能够直接拿来用

#应用于控制台
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 结果:数据库链接池从初始化,开启,数据库操做直到关闭都能看获得