Druid是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括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數據源-->
<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>
<!--設置最大連接數-->
<property name="maxActive" value="20"></property>
<!--設置等待時間-->
<property name="maxWait" value="5000"/>
<!--配置數據源監(jiān)控的filter-->
<property name="filters" value="stat"></property>
</bean>
在web應用中的WEB-INF/web.xml中進行相關配置?
<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>-->
<url-pattern>/*</url-pattern>
</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;
}
/**
* 配置WebStatFilter
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
//設置過濾器
filterRegistrationBean.setFilter(new WebStatFilter());
//url過濾規(guī)則
filterRegistrationBean.addUrlPatterns("/*");
//忽略
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
@Bean
public StatFilter statFilter() {
StatFilter statFilter = new StatFilter();
//慢sql記錄
statFilter.setLogSlowSql(true);
statFilter.setMergeSql(true);
//超過多少時間為慢sql
statFilter.setSlowSqlMillis(3000);
return statFilter;
}
/**
* SQL防火墻攔截器(按需使用,達夢數據庫啟動會發(fā)生異常)
* @return
*/
@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的內容
spring:
datasource:
url: ******
username: ******
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 指定數據源類型
######### 連接池 配置 ##########
druid:
# 配置初始化大小、最小、最大
initial-size: 5
minIdle: 10
max-active: 20
# 配置獲取連接等待超時的時間(單位:毫秒)
max-wait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
# time-between-eviction-runs-millis: 2000
# 配置一個連接在池中最小生存的時間,單位是毫秒
# min-evictable-idle-time-millis: 600000
# max-evictable-idle-time-millis: 900000
# 用來測試連接是否可用的SQL語句,默認值每種數據庫都不相同,這是mysql
# validationQuery: select 1
# 應用向連接池申請連接,并且testOnBorrow為false時,連接池將會判斷連接是否處于空閑狀態(tài),如果是,則驗證這條連接是否可用
# testWhileIdle: true
# 如果為true,默認是false,應用向連接池申請連接時,連接池會判斷這條連接是否是可用的
# testOnBorrow: false
# 如果為true(默認false),當應用使用完連接,連接池回收連接的時候會判斷該連接是否還可用
# testOnReturn: false
# 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle
# poolPreparedStatements: true
# 要啟用PSCache,必須配置大于0,當大于0時, poolPreparedStatements自動觸發(fā)修改為true,
# 在Druid中,不會存在Oracle下PSCache占用內存過多的問題,
# 可以把這個數值配置大一些,比如說100
# maxOpenPreparedStatements: 20
# 連接池中的minIdle數量以內的連接,空閑時間超過minEvictableIdleTimeMillis,則會執(zhí)行keepAlive操作
# keepAlive: true
# Spring 監(jiān)控,利用aop 對指定接口的執(zhí)行時間,jdbc數進行記錄
aop-patterns: "com.springboot.template.dao.*"
########### 啟用內置過濾器(第一個 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 就認為是慢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關聯(lián)監(jiān)控的數據 ##########
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的最大個數,默認100
session-stat-max-count: 1000
########## 配置StatViewServlet(監(jiān)控頁面),用于展示Druid的統(tǒng)計信息 ##########
stat-view-servlet:
# 啟用StatViewServlet
enabled: true
# 訪問內置監(jiān)控頁面的路徑,內置監(jiān)控頁面的首頁是/druid/index.html
url-pattern: /druid/*
# 不允許清空統(tǒng)計數據,重新計算
reset-enable: false
# 配置監(jiān)控頁面訪問密碼
login-username: root
login-password: 123
# 允許訪問的地址,如果allow沒有配置或者為空,則允許所有訪問
# allow:
# 拒絕訪問的地址,deny優(yōu)先于allow,如果在deny列表中,就算在allow列表中,也會被拒絕
# deny:
訪問監(jiān)控頁面
頁面簡單介紹?文章來源:http://www.zghlxwxcb.cn/news/detail-848854.html
1、數據源頁面:是當前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果沒有配置Filter(一些信息會無法統(tǒng)計,例如“SQL監(jiān)控”,會無法獲取JDBC相關的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數進行記錄。
5、SQL防火墻頁面:druid提供了黑白名單的訪問,可以清楚的看到sql防護情況。
6、Session監(jiān)控頁面:可以看到當前的session狀況,創(chuàng)建時間、最后活躍時間、請求次數、請求時間等詳細參數。
7、JSONAPI 頁面:通過api的形式訪問Druid的監(jiān)控接口,api接口返回Json形式數據。?文章來源地址http://www.zghlxwxcb.cn/news/detail-848854.html
到了這里,關于Springboot集成Druid實現(xiàn)監(jiān)控功能的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!