前言
数据库连接池负责分配、管理和释放数据库连接,它允许程序重复使用一个现有的连接,而不是再重新建立一个。释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。常见的数据库连接池有c3p0,druid,hikari,DBCP等。Hikari是一款非常强大,高效,并且号称“史上最快连接池”。并且在springboot2.0之后,采用的默认数据库连接池就是Hikari。Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 数据库连接池的优点,同时加入了日志监控。
一、导入相关依赖
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(); } }
2、导入Druid和log4j依赖
<!-- 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>
二、在配置文件中对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
三、自定义Druid数据源配置
1、为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中
@Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druidDataSource() { return new DruidDataSource(); }
2、配置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,这就是为什么进行Druid后台账号密码配置时,要创建一个Map集合了。
四、进行监控
1、先写好一些SQl语句,将数据库的数据用Json传递给前端
2、进入Druid的登录界面,输入http://localhost:8080/druid/login.html
3、查看监控情况
五、遇到的问题
发现执行时报下列错误:
log4j:WARN No appenders could be found for logger (druid.sql.Connection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN Seehttp://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
结果:数据库连接池从初始化,开启,数据库操作直到关闭都能看得到