SpringBoot集成Druid實現(xiàn)監(jiān)控功能的示例代碼
Druid是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數(shù)據(jù)庫連接池,在功能、性能、擴展性方面,都超過其他數(shù)據(jù)庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒殺一切。Druid可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對監(jiān)控而生的DB連接池。
官方的參考
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
一、傳統(tǒng)web項目(如ssh,ssm)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>使用xml或配置類配置好DruidDataSource
<!--使用druid數(shù)據(jù)源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
<!--注入連接屬性-->
<property name="driverClassName" value="xxx"/>
<property name="url" value="xxx"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
<!--初始化連接池大小-->
<property name="initialSize" value="5"></property>
<!--設(shè)置最大連接數(shù)-->
<property name="maxActive" value="20"></property>
<!--設(shè)置等待時間-->
<property name="maxWait" value="5000"/>
<!--配置數(shù)據(jù)源監(jiān)控的filter-->
<property name="filters" value="stat"></property>
</bean>在web應(yīng)用中的WEB-INF/web.xml中進行相關(guān)配置
<servlet> <servlet-name>StatViewServlet</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <!--登陸名--> <init-param> <param-name>loginUsername</param-name> <param-value>admin</param-value> </init-param> <!-- 登錄密碼--> <init-param> <param-name>loginPassword</param-name> <param-value>2024</param-value> </init-param> <!--白名單--> <init-param> <param-name>allow</param-name> <param-value></param-value> </init-param> <!--黑名單--> <init-param> <param-name>deny</param-name> <param-value></param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>StatViewServlet</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> <filter> <filter-name>WebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <!--過濾的樣式--> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.css,*.ico,*.jpg,*.png,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>WebStatFilter</filter-name> <servlet-name>StatViewServlet</servlet-name> </filter-mapping>
二、springboot中引入原生的druid,依賴和上面一樣,編寫配置類即可
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.beans.factory.annotation.Value;
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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Configuration
public class DruidConfig {
//登陸賬號
private final String USERNAME = "root";
//登陸密碼
private final String PASSWORD = "123";
@Value("${spring.datasource.url:#{null}}")
private String dbUrl;
@Value("${spring.datasource.username: #{null}}")
private String username;
@Value("${spring.datasource.password:#{null}}")
private String password;
@Value("${spring.datasource.driverClassName:#{null}}")
private String driverClassName;
/**
* 以下屬性可在配置文件自行定義
*/
private Integer initialSize = 5;
private Integer minIdle = 10;
private Integer maxActive = 20;
private Integer maxWait = 60000;
@Bean
@Primary
public DruidDataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
if (initialSize != null) {
datasource.setInitialSize(initialSize);
}
if (minIdle != null) {
datasource.setMinIdle(minIdle);
}
if (maxActive != null) {
datasource.setMaxActive(maxActive);
}
if (maxWait != null) {
datasource.setMaxWait(maxWait);
}
List<Filter> filters = new ArrayList<>();
filters.add(statFilter());
filters.add(wallFilter());
datasource.setProxyFilters(filters);
return datasource;
}
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
Map<String, String> initParameters = new HashMap<>();
//禁用HTML頁面上的“Rest All”功能
initParameters.put("resetEnable", "false");
//ip白名單(沒配置則允許所有訪問)
//initParameters.put("allow", "");
//ip黑名單,如果某個ip同時存在,deny優(yōu)先于allow
//initParameters.put("deny", "");
initParameters.put("loginUsername", USERNAME);
initParameters.put("loginPassword", PASSWORD);
servletRegistrationBean.setInitParameters(initParameters);
return servletRegistrationBean;
}
@Bean
public StatFilter statFilter() {
StatFilter statFilter = new StatFilter();
//慢sql記錄
statFilter.setLogSlowSql(true);
statFilter.setMergeSql(true);
//超過多少時間為慢sql
statFilter.setSlowSqlMillis(3000);
return statFilter;
}
@Bean
public WallFilter wallFilter() {
WallFilter wallFilter = new WallFilter();
//允許執(zhí)行多條SQL
WallConfig config = new WallConfig();
config.setMultiStatementAllow(true);
wallFilter.setConfig(config);
return wallFilter;
}
}三、springboot druid starter方式
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.23</version> </dependency>
按需配置application.yml的內(nèi)容
spring:
datasource:
url: ******
username: ******
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 指定數(shù)據(jù)源類型
######### 連接池 配置 ##########
druid:
# 配置初始化大小、最小、最大
initial-size: 5
minIdle: 10
max-active: 20
# 配置獲取連接等待超時的時間(單位:毫秒)
max-wait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
# time-between-eviction-runs-millis: 2000
# 配置一個連接在池中最小生存的時間,單位是毫秒
# min-evictable-idle-time-millis: 600000
# max-evictable-idle-time-millis: 900000
# 用來測試連接是否可用的SQL語句,默認(rèn)值每種數(shù)據(jù)庫都不相同,這是mysql
# validationQuery: select 1
# 應(yīng)用向連接池申請連接,并且testOnBorrow為false時,連接池將會判斷連接是否處于空閑狀態(tài),如果是,則驗證這條連接是否可用
# testWhileIdle: true
# 如果為true,默認(rèn)是false,應(yīng)用向連接池申請連接時,連接池會判斷這條連接是否是可用的
# testOnBorrow: false
# 如果為true(默認(rèn)false),當(dāng)應(yīng)用使用完連接,連接池回收連接的時候會判斷該連接是否還可用
# testOnReturn: false
# 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle
# poolPreparedStatements: true
# 要啟用PSCache,必須配置大于0,當(dāng)大于0時, poolPreparedStatements自動觸發(fā)修改為true,
# 在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,
# 可以把這個數(shù)值配置大一些,比如說100
# maxOpenPreparedStatements: 20
# 連接池中的minIdle數(shù)量以內(nèi)的連接,空閑時間超過minEvictableIdleTimeMillis,則會執(zhí)行keepAlive操作
# keepAlive: true
# Spring 監(jiān)控,利用aop 對指定接口的執(zhí)行時間,jdbc數(shù)進行記錄
aop-patterns: "com.springboot.template.dao.*"
########### 啟用內(nèi)置過濾器(第一個 stat必須,否則監(jiān)控不到SQL)##########
filters: stat,wall,log4j2
# 自己配置監(jiān)控統(tǒng)計攔截的filter
filter:
# 開啟druiddatasource的狀態(tài)監(jiān)控
stat:
enabled: true
db-type: mysql
# 開啟慢sql監(jiān)控,超過2s 就認(rèn)為是慢sql,記錄到日志中
log-slow-sql: true
slow-sql-millis: 2000
# 日志監(jiān)控,使用slf4j 進行日志輸出
# slf4j:
# enabled: true
# statement-log-error-enabled: true
# statement-create-after-log-enabled: false
# statement-close-after-log-enabled: false
# result-set-open-after-log-enabled: false
# result-set-close-after-log-enabled: false
########## 配置WebStatFilter,用于采集web關(guān)聯(lián)監(jiān)控的數(shù)據(jù) ##########
web-stat-filter:
# 啟動 StatFilter
enabled: true
# 過濾所有url
url-pattern: /*
# 排除一些不必要的url
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# 開啟session統(tǒng)計功能
session-stat-enable: true
# session的最大個數(shù),默認(rèn)100
session-stat-max-count: 1000
########## 配置StatViewServlet(監(jiān)控頁面),用于展示Druid的統(tǒng)計信息 ##########
stat-view-servlet:
# 啟用StatViewServlet
enabled: true
# 訪問內(nèi)置監(jiān)控頁面的路徑,內(nèi)置監(jiān)控頁面的首頁是/druid/index.html
url-pattern: /druid/*
# 不允許清空統(tǒng)計數(shù)據(jù),重新計算
reset-enable: false
# 配置監(jiān)控頁面訪問密碼
login-username: root
login-password: 123
# 允許訪問的地址,如果allow沒有配置或者為空,則允許所有訪問
# allow:
# 拒絕訪問的地址,deny優(yōu)先于allow,如果在deny列表中,就算在allow列表中,也會被拒絕
# deny:訪問監(jiān)控頁面

頁面簡單介紹
1、數(shù)據(jù)源頁面:是當(dāng)前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果沒有配置Filter(一些信息會無法統(tǒng)計,例如“SQL監(jiān)控”,會無法獲取JDBC相關(guān)的SQL執(zhí)行信息)。
2、SQL監(jiān)控頁面:統(tǒng)計了所有SQL語句的執(zhí)行情況。
3、URL監(jiān)控頁面:統(tǒng)計了所有Controller接口的訪問以及執(zhí)行情況。
4、Spring 監(jiān)控頁面,利用aop 對指定接口的執(zhí)行時間,jdbc數(shù)進行記錄。
5、SQL防火墻頁面:druid提供了黑白名單的訪問,可以清楚的看到sql防護情況。
6、Session監(jiān)控頁面:可以看到當(dāng)前的session狀況,創(chuàng)建時間、最后活躍時間、請求次數(shù)、請求時間等詳細(xì)參數(shù)。
7、JSONAPI 頁面:通過api的形式訪問Druid的監(jiān)控接口,api接口返回Json形式數(shù)據(jù)。
以上就是SpringBoot集成Druid實現(xiàn)監(jiān)控功能的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Druid監(jiān)控的資料請關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot集成Druid監(jiān)控慢SQL的詳細(xì)過程
- SpringBoot+Druid開啟監(jiān)控頁面的實現(xiàn)示例
- Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式
- SpringBoot3整合Druid監(jiān)控功能的項目實踐
- SpringBoot整合Druid實現(xiàn)數(shù)據(jù)庫連接池和監(jiān)控
- springboot項目中實現(xiàn)訪問druid內(nèi)置監(jiān)控頁面
- SpringBoot集成Druid監(jiān)控頁面最小化配置操作
- SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實例
- 使用SpringBoot簡單了解Druid的監(jiān)控系統(tǒng)的配置方法
- spring boot基于DRUID實現(xiàn)數(shù)據(jù)源監(jiān)控過程解析
- Spring Boot 整合 Druid 并開啟監(jiān)控
相關(guān)文章
Mybatis反向工程出現(xiàn)BigDecimal類型問題及解決
這篇文章主要介紹了Mybatis反向工程出現(xiàn)BigDecimal類型問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09
Spring中網(wǎng)絡(luò)請求客戶端WebClient的使用詳解
作為替代,Spring 官方已在 Spring 5 中引入了 WebClient 作為非阻塞式 Reactive HTTP 客戶端,本文將通過樣例演示如何使用 WebClient,希望對大家有所幫助2024-04-04
SpringBoot集成netty實現(xiàn)websocket通信功能
Netty是一個高性能、異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護的高性能協(xié)議服務(wù)器和客戶端,WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,相比傳統(tǒng)的HTTP協(xié)議,本文給大家介紹了SpringBoot集成netty實現(xiàn)websocket通信功能,需要的朋友可以參考下2024-03-03
Java try-catch-finally異常處理機制詳解
這篇文章主要介紹了Java try-catch-finally異常處理機制詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
學(xué)習(xí)Java設(shè)計模式之觀察者模式
這篇文章主要為大家介紹了Java設(shè)計模式中的觀察者模式,對Java設(shè)計模式感興趣的小伙伴們可以參考一下2016-01-01
springboot整合netty框架實現(xiàn)站內(nèi)信
Netty 是一個基于NIO的客戶、服務(wù)器端編程框架,使用Netty 可以確保你快速和簡單的開發(fā)出一個網(wǎng)絡(luò)應(yīng)用,這篇文章主要介紹了springboot整合netty框架的方式小結(jié),需要的朋友可以參考下2022-12-12

