自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Boot 如何監(jiān)控 SQL 運行情況?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
Druid 數(shù)據(jù)庫連接池相信很多小伙伴都用過,個人感覺 Druid 是阿里比較成功的開源項目了,不像 Fastjson 那么多槽點,Druid 各方面一直都比較出色,功能齊全,使用也方便,基本的用法就不說了,今天我們來看看 Druid 中的監(jiān)控功能。

今天想和大家聊一聊 Druid 中的監(jiān)控功能。

Druid 數(shù)據(jù)庫連接池相信很多小伙伴都用過,個人感覺 Druid 是阿里比較成功的開源項目了,不像 Fastjson 那么多槽點,Druid 各方面一直都比較出色,功能齊全,使用也方便,基本的用法就不說了,今天我們來看看 Druid 中的監(jiān)控功能。

1. 準備工作

首先我們來創(chuàng)建一個 Spring Boot 工程,引入 MyBatis 等,如下:

選一下 MyBatis 和 MySQL 驅(qū)動,做一個簡單的測試案例。

先來連接一下數(shù)據(jù)庫:

spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///test05?serverTimezone=Asia/Shanghai

創(chuàng)建一個 User 實體類,做一個簡單的查詢案例,如下:

public class User {
private Integer id;
private String username;
private String address;
private String password;
private String email;
//省略 getter/setter
}
@Mapper
public interface UserMapper {
List<User> getUserByUsername(String username);
}
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> getUserByUsername(String username){
return userMapper.getUserByUsername(username);
}
}
@RestController
public class UserController {
@Autowired
UserService userService;

@GetMapping("/user")
public List<User> getUser(String username) {
return userService.getUserByUsername(username);
}
}

UserMapper.xml 如下:

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.javaboy.druid_monitor.mapper.UserMapper">
<select id="getUserByUsername" resultType="org.javaboy.druid_monitor.model.User">
select * from user where username=#{username}
</select>
</mapper>

一個很簡單的測試,沒啥好說的。

這個環(huán)境搭建大家隨意,如果你已經(jīng)有持久化的案例了,那就直接看第二小節(jié)引入 Druid。

現(xiàn)在這個工程默認的使用的數(shù)據(jù)庫連接池是 HikariDataSource,這是 Spring Boot 中默認的一個數(shù)據(jù)庫連接池,其實這個也還不錯。

2. 引入 Druid

接下來我們引入 Druid:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>

注意,Spring Boot 引入的 Druid 是上面這個,這個將來配置監(jiān)控的時候方便一些。

接下來我們在 application.properties 中配置 WebStatFilter,WebStatFilter 用于采集 web-jdbc 關(guān)聯(lián)監(jiān)控的數(shù)據(jù):

# 啟用 WebStatFilter
spring.datasource.druid.web-stat-filter.enabled=true
# 配置攔截規(guī)則
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 排除一些不必要的 url,這些 URL 不會涉及到 SQL 查詢
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
# 開啟 session 統(tǒng)計功能
spring.datasource.druid.web-stat-filter.session-stat-enable=true
# 缺省 sessionStatMaxCount 是 1000 個,我們可以按需要進行配置
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
# 配置 principalSessionName,使得 druid 能夠知道當前的 session 的用戶是誰
# 根據(jù)需要,這個參數(shù)的值是 user 信息保存在 session 中的 sessionName
#spring.datasource.druid.web-stat-filter.principal-session-name=
# 下面這個配置的作用和上面配置的作用類似,這個是通過 Cookie 來識別用戶
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
# 開啟 profile 后就能夠監(jiān)控單個 URL 地址調(diào)用列表
#spring.datasource.druid.web-stat-filter.profile-enable=

我們配置前面五個就可以了,后面三個可以不用配置,各項配置的含義松哥已經(jīng)在代碼中列出來了。

接下來開啟 StatViewServlet 的配置,如下:

# 啟用內(nèi)置的監(jiān)控頁面
spring.datasource.druid.stat-view-servlet.enabled=true
# 內(nèi)置監(jiān)控頁面的地址
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 開啟 Reset All 功能
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 設(shè)置登錄用戶名
spring.datasource.druid.stat-view-servlet.login-username=javaboy
# 設(shè)置登錄密碼
spring.datasource.druid.stat-view-servlet.login-password=123
# 白名單(如果allow沒有配置或者為空,則允許所有訪問)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
# 黑名單(deny 優(yōu)先于 allow,如果在 deny 列表中,就算在 allow 列表中,也會被拒絕)
spring.datasource.druid.stat-view-servlet.deny=

配置一下頁面地址,配置一下黑白名單即可。

需要注意的是,reset-enable 屬性即使設(shè)置為 false,重置按鈕也會顯示,只是點擊該按鈕并不會重置而已。

好啦,這就完事了。

3. 測試

好啦,接下來我們啟動 Spring Boot 項目進行測試。

Spring Boot 項目啟動成功后,首先訪問如下地址:

??http://localhost:8080/druid/login.html??

此時我們會看到登錄認證頁面,如下:

輸入我們前面配置的用戶名/密碼(javaboy/123)進行登錄,登錄成功后,可以看到如下頁面:

從標題欄就可以看到,數(shù)據(jù)源、SQL 監(jiān)控、SQL 防火墻等功能都是一應(yīng)俱全。

接下來我們訪問 http://localhost:8080/user?username=aaa 地址,執(zhí)行一條 SQL,執(zhí)行完成后,我們來查看 SQL 監(jiān)控:

可以看到,此時就有 SQL 執(zhí)行的監(jiān)控記錄了。

其他的監(jiān)控數(shù)據(jù)也都可以看到,我就不一一列舉了。如果小伙伴們覺得這里展示的數(shù)據(jù)不直觀,想自己畫 HTML 頁面,那也是可以的,點擊最后面的 JSON API,可以看到每一個監(jiān)控項的 JSON 地址,拿著 JSON 自己想怎么顯示就怎么顯示。

4. 去廣告

如果想直接用這個監(jiān)控頁面,這個上面有阿里的廣告,如下圖,公司用的話就特別別扭:

我們可能想去掉這個廣告,這也很容易。

首先,經(jīng)過分析,我們發(fā)現(xiàn)廣告是由一個叫做 common.js 的文件構(gòu)建出來的,該文件位于druid-1.2.8.jar!/support/http/resources/js/common.js 這里,common.js 文件中有如下幾行:

init : function() {
this.buildFooter();
druid.lang.init();
},
buildFooter : function() {
var html ='';
$(document.body).append(html);
},

大概邏輯就是上面這樣,buildFooter 方法負責構(gòu)建頁面末尾的廣告,在 init 方法中完成對 buildFooter 方法的調(diào)用。

那么想要去除廣告,就別調(diào)用 buildFooter 方法就行了。

所以我們的去廣告思路也很簡單,寫一個過濾器,攔截下對 common.js 的請求,然后做一點點修改,如下:

@WebFilter(urlPatterns = "/druid/js/common.js")
public class RemoveAdFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String text = Utils.readFromResource("support/http/resources/js/common.js");
text = text.replace("this.buildFooter();", "");
servletResponse.getWriter().write(text);
}
}

可以看到,這個過濾器就是攔截 /druid/js/common.js 請求,攔截到之后,自己去文件中讀取 common.js 文件,然后手動替換掉this.buildFooter(); 這一句就行了,最后再把文件寫出去就行了。

當然,記得在啟動類中掃描 Filter,如下:

@SpringBootApplication
@ServletComponentScan("org.javaboy.druid_monitor.filter")
public class DruidMonitorApplication {

public static void main(String[] args) {
SpringApplication.run(DruidMonitorApplication.class, args);
}

}

好啦,這就可以啦,有了這個過濾器,廣告就沒了。

https://github.com/alibaba/druid/wiki/

本文轉(zhuǎn)載自微信公眾號「江南一點雨」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系江南一點雨公眾號。

責任編輯:武曉燕 來源: 江南一點雨
相關(guān)推薦

2022-02-17 13:32:04

SpringBootSQL連接池

2023-11-06 09:37:23

Java日志

2013-05-16 13:57:31

SNMP網(wǎng)絡(luò)運維管理

2022-05-18 08:32:05

服務(wù)監(jiān)控Prometheus開源

2022-07-11 09:36:38

SpringJava開發(fā)

2019-07-17 16:38:08

微軟Windows 10操作系統(tǒng)

2018-10-22 15:34:31

Spring Boo監(jiān)控視化

2022-02-09 20:39:52

Actuator應(yīng)用監(jiān)控

2020-12-01 08:32:12

Spring Boot

2022-12-05 13:45:06

Actuator監(jiān)控

2021-02-03 12:47:09

Spring Boot應(yīng)用監(jiān)控

2023-12-27 18:05:13

2020-11-10 09:19:23

Spring BootJava開發(fā)

2010-09-01 10:08:54

DB2SQL語句

2023-07-27 08:53:44

2011-10-10 14:42:22

SQL Server

2020-07-14 11:00:12

Spring BootRedisJava

2021-08-06 08:04:14

Spring Boot自動配置

2022-07-28 06:50:52

微服務(wù)業(yè)務(wù)系統(tǒng)

2021-12-18 07:42:15

Ebpf 監(jiān)控 Node.js
點贊
收藏

51CTO技術(shù)棧公眾號