springboot(4)Druid作为项目数据源(添加监控)
参考博客:恒宇少年:https://www.jianshu.com/p/e84e2709f383
Druid简介
Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目。Druid支持所有JDBC兼容数据库,包括了Oracle、MySQL、PostgreSQL、SQL Server、H2等。
Druid在监控、可扩展性、稳定性和性能方面具有明显的优势。
Druid在监控、可扩展性、稳定性和性能方面具有明显的优势。
通过Druid提供的监控功能,可以实时观察数据库连接池和SQL查询的工作情况。使用Druid连接池在一定程度上可以提高数据访问效率。
本文知识点:(本文访问数据库用的是Spring Data JPA)
整合Druid完成MySQL数据访问,以及配置Druid监控模块整合。
一、项目搭建,项目目录及数据库显示
![](https://img2018.cnblogs.com/blog/1556518/201901/1556518-20190116185023895-1563828261.png)
对应数据库的bean类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 + '\'' + '}'; } }
二、导入依赖
访问mvnrepository.com/artifact/com.alibaba/druid,选择依赖版本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
三、添加配置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层代码及测试结果
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@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; } }
启动后日志显示,证明SpringBoot已经把Druid当做dataSource加载到了项目中
Druid监控功能
开启监控功能,可以在应用运行的过程中,通过监控提供的多维度数据来分析使用数据库的运行情况,从而可以调整程序设计,以便于优化数据库的访问性能。
一、实现Druid的访问Servlet以及Filter,实现代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; } }
二、查看监控结果
我们已经配置完成了Druid的监控,我们现在来重启项目,查看IntellJ IDEA工具的控制台是否正常运行,如果正常证明你已经配置成功。代码中的@Configuration注解是用来配置SpringBoot项目的配置注解,如果将该注解配置在实体类上,该类内的所有bean以及配置都会应用的全局。
项目运行成功后,我们要访问Druid的监控界面,访问地址:127.0.0.1:8080/druid/login.html,账户和密码是在我们代码中设定的:
项目运行成功后,我们要访问Druid的监控界面,访问地址:127.0.0.1:8080/druid/login.html,账户和密码是在我们代码中设定的:
![](https://img2018.cnblogs.com/blog/1556518/201901/1556518-20190116190236789-1457475810.png)
![](https://img2018.cnblogs.com/blog/1556518/201901/1556518-20190116190215755-1593855031.png)
我们已经成功的访问到了监控首页,可以看到大致包含了如下几个模块:数据源、SQL监控、SQL防火墙、Web应用、URI监控、Session监控、JSONAPI等。
数据源
可以看到项目中管理的所有数据源配置的详细情况,除了密码没有显示外其他都在。
SQL监控
可以查看所有的执行sql语句
SQL防火墙
druid提供了黑白名单的访问,可以清楚的看到sql防护情况。
Web应用
可以看到目前运行的web程序的详细信息。
URI监控
可以监控到所有的请求路径的请求次数、请求时间等其他参数。
Session监控
可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。
JSONAPI
通过api的形式访问Druid的监控接口,api接口返回Json形式数据。