Druid简介
Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目。Druid支持所有JDBC兼容数据库,包括了Oracle、MySQL、PostgreSQL、SQL Server、H2等。
Druid在监控、可扩展性、稳定性和性能方面具有明显的优势。
通过Druid提供的监控功能,可以实时观察数据库连接池和SQL查询的工作情况。使用Druid连接池在一定程度上可以提高数据访问效率。
本文知识点:(本文访问数据库用的是Spring Data JPA)
整合Druid完成MySQL数据访问,以及配置Druid监控模块整合。
一、项目搭建,项目目录及数据库显示
对应数据库的bean类
package com.dyh.bean;
//import org.hibernate.annotations.Table;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "student")
public class Student implements Serializable{
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "stu_id")
private String sId;
@Column(name = "stu_name")
private String name;
@Column(name = "stu_sex")
private String sex;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getsId() {
return sId;
}
public void setsId(String sId) {
this.sId = sId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", sId='" + sId + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
View Code
二、导入依赖
访问com/artifact/com.alibaba/druid">mvnrepository.com/artifact/com.alibaba/druid,选择依赖版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dyh</groupId>
<artifactId>lesson_three</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>lesson_three</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<!--spring-data-jpa-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<!--ysql-connector-java的支持-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<!--如果使用的是内部Tomcat,那么应该注释掉<scope></scope>-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<!--Druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
View Code
三、添加配置application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/test_one?serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: dyhroot
#最大活跃数
maxActive: 20
#初始化数量
initialSize: 1
#最大连接等待超时时间
maxWait: 60000
#打开PSCache,并且指定每个连接PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
#通过connectionProperties属性来打开mergeSql功能;慢SQL记录
#connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
#配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙
filters: stat, wall, log4j
jpa:
database: MySQL
show-sql: true
hibernate:
# naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
# ddl-auto: create
format_sql: true
四、controller层代码及测试结果
@RestController
public class StudentController {
@Autowired
private StudentJPA stuJPA;
@RequestMapping(value = "/jpaList",method = RequestMethod.GET)
public List<Student> getStu(){
List<Student> all = stuJPA.findAll();
return stuJPA.findAll();
}
@RequestMapping(value = "/jpaAddStu",method = RequestMethod.GET)
public Student addStu(Student student){
Student stu = new Student();
stu.setName("xiaolan");
stu.setSex("nan");
stu.setsId("A5");
Student save = stuJPA.save(stu);
return save;
}
}
View Code
启动后日志显示,证明SpringBoot已经把Druid当做dataSource加载到了项目中
Druid监控功能
开启监控功能,可以在应用运行的过程中,通过监控提供的多维度数据来分析使用数据库的运行情况,从而可以调整程序设计,以便于优化数据库的访问性能。
一、实现Druid的访问Servlet以及Filter,实现代码如下:
package com.dyh;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
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;
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean statViewServlet(){
//创建servlet注册实体
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//设置ip白名单
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
servletRegistrationBean.addInitParameter("deny","192.168.0.19");
//设置控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername","druid");
servletRegistrationBean.addInitParameter("loginPassword","123456");
//是否可以重置数据
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
//忽略过滤的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
View Code
二、查看监控结果
我们已经配置完成了Druid的监控,我们现在来重启项目,查看IntellJ IDEA工具的控制台是否正常运行,如果正常证明你已经配置成功。代码中的@Configuration注解是用来配置SpringBoot项目的配置注解,如果将该注解配置在实体类上,该类内的所有bean以及配置都会应用的全局。
项目运行成功后,我们要访问Druid的监控界面,访问地址:127.0.0.1:8080/druid/login.html,账户和密码是在我们代码中设定的:
我们已经成功的访问到了监控首页,可以看到大致包含了如下几个模块:数据源、SQL监控、SQL防火墙、Web应用、URI监控、Session监控、JSONAPI等。
数据源
可以看到项目中管理的所有数据源配置的详细情况,除了密码没有显示外其他都在。
SQL监控
可以查看所有的执行sql语句
SQL防火墙
druid提供了黑白名单的访问,可以清楚的看到sql防护情况。
Web应用
可以看到目前运行的web程序的详细信息。
URI监控
可以监控到所有的请求路径的请求次数、请求时间等其他参数。
Session监控
可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。
JSONAPI
通过api的形式访问Druid的监控接口,api接口返回Json形式数据。