SpringBoot系列之集成Druid配置數據源監控
繼上一篇博客SpringBoot系列之JDBC數據訪問之后,本博客再介紹數據庫連接池框架Druid的使用
實驗環境准備:
- Maven
- IntelliJ IDEA
先新建一個Springboot Initializer項目,詳情參考SpringBoot系列之快速創建Initializer項目,注意引入必須的JDBC,web依賴等等,因為Druid默認沒提供,所以去https://mvnrepository.com/artifact/com.alibaba/druid獲取配置信息,項目創建之后,pom配置應該有如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.2</version>
</dependency>
新增一個application.yml配置文件,加上如下配置:type: com.alibaba.druid.pool.DruidDataSource必須指定
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
initialization-mode: always
type: com.alibaba.druid.pool.DruidDataSource
# 連接池設置
initial-size: 5
min-idle: 5
max-active: 20
# 配置獲取連接等待超時的時間
max-wait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
time-between-eviction-runs-millis: 90000
# 配置一個連接在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 300000
# Oracle請使用select 1 from dual
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打開PSCache,並且指定每個連接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
filters: stat,wall,slf4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合並多個DruidDataSource的監控數據
use-global-data-source-stat: true
寫一個junit測試類進行測試:
package com.example.springboot.jdbc;
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 SppringbootJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
}
經過調試,屬性都沒起效,原因是Springboot的自動配置類並沒有如下屬性的,所以在idea里都標識顯示如下顏色:
所以要讓這些配置起效,需要寫個配置類,通過ConfigurationProperties進行屬性映射
@Configuration
public class DriudConfig {
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
return new DruidDataSource();
}
}
再次啟動junit調試,發現屬性都起效了,ok,測試通過
Druid提供了一個針對數據源等等進行監控的平台,所以需要配置才能正常使用
package com.example.springboot.jdbc.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
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 org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
/**
* <pre>
* Druid配置類
* </pre>
*
* @author nicky
* <pre>
* 修改記錄
* 修改后版本: 修改人: 修改日期: 2019年12月15日 修改內容:
* </pre>
*/
@Configuration
public class DriudConfig {
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
return new DruidDataSource();
}
/**
* 注冊ServletRegistrationBean
* @return
*/
@Bean
public ServletRegistrationBean registrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
/** 初始化參數配置,initParams**/
//白名單
bean.addInitParameter("allow", "127.0.0.1");
//IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
bean.addInitParameter("deny", "192.168.1.73");
//登錄查看信息的賬號密碼.
bean.addInitParameter("loginUsername", "admin");
bean.addInitParameter("loginPassword", "admin");
//是否能夠重置數據.
bean.addInitParameter("resetEnable", "false");
return bean;
}
/**
* 注冊FilterRegistrationBean
* @return
*/
@Bean
public FilterRegistrationBean druidStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
//添加過濾規則.
bean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
bean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return bean;
}
}
ok,訪問http://127.0.0.1:8080/ ,輸入代碼里配置的賬號密碼就可以登錄進行訪問,我設置的賬號密碼都是admin,輸入賬號密碼登錄平台,查詢數據源,sql監控等等功能
代碼例子下載:github下載鏈接