Druid是Java語言中最好的資料庫連接配接池,并且能夠提供強大的監控和擴充功能。(Druid可以幫我們時時監控程式與資料庫的互動情況)
SpringBoot內建Druid使用步驟:
1. 建立一個Springboot項目後(或者在現有的springboot項目中),在pom.xml中導入Druid依賴的jar包
<!-- druid資料庫依賴包 -->
<!--導jar包網站: https://mvnrepository.com/-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
2. 在application.properties配置檔案中添加springData配置屬性
#配置内置tomcat端口号(配置項目端口号,此處可忽略)
server.port=8082
#資料庫配置(若已經配置了,此處可忽略)
spring.jpa.database=mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.100.75:3306/octopus?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true
spring.datasource.username=666
spring.datasource.password=mmm
#mybatis 配置(若已經指定mapper映射檔案位置了,此處配置可忽略)
#掃描映射檔案:指定resource下mapper映射檔案位置
mybatis.mapper-locations=classpath:mapper/*/*Mapper.xml
#可在mybatis-config.xml檔案中配置STDOUT_LOGGING,請求時可在控制台列印出sql語句
mybatis.config-location=classpath:mybatis-config.xml
# 連接配接池的配置資訊(以下配置選項是此處重點)
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置目前要使用的資料源的操作類型
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
# 配置擷取連接配接等待逾時的時間
spring.datasource.maxWait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接配接,機關是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一個連接配接在池中最小生存的時間,機關是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.exceptionSorter=true
spring.datasource.testOnReturn=false
# 打開PSCache,并且指定每個連接配接上PSCache的大小
spring.datasource.poolPreparedStatements=true
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用于防火牆
spring.datasource.filters=stat,wall,log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
spring.datasource.useGlobalDataSourceStat=true
3. 和application啟動類同級下建立一個config包,用來讀取上面設定的springData資料源配置項
package com.hokai.config;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration //聲明此類是個配置類,相當于之前的xml配置檔案
@Primary
/* @Primary :表示這裡定義的DataSource将覆寫其他來源的DataSource(在同樣的DataSource中,首先使用被标注的DataSource);
此注解最好用在類上,也可以用在方法上,因為此注解用在方法上仍有可能被其他的DataSource覆寫此處的DataSource */
public class DruidConfiguration {
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.initialSize}")
private int initialSize;
@Value("${spring.datasource.minIdle}")
private int minIdle;
@Value("${spring.datasource.maxActive}")
private int maxActive;
@Value("${spring.datasource.maxWait}")
private int maxWait;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;
@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.filters}")
private String filters;
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${spring.datasource.connectionProperties}")
private String connectionProperties;
@Value("${spring.datasource.useGlobalDataSourceStat}")
private boolean useGlobalDataSourceStat;
/**
* @Bean 聲明,DataSource 對象為 Spring 容器所管理;
* @Primary 表示這裡定義的DataSource将覆寫其他來源的DataSource。
* StatFilter,用于統計監控資訊。StatFilter的别名是stat。
* 統計SQL資訊,合并統計。mergeStat是的MergeStatFilter縮寫。
* 通過 DataSource 的屬性<property name="filters" value="mergeStat" /> 或者
* connectProperties屬性來打開mergeSql功能 <property name="connectionProperties" value="druid.stat.mergeSql=true" />
* StatFilter屬性slowSqlMillis用來配置SQL慢的标準
*
* @return
*/
@Bean // DataSource對象被@Bean聲明,交給Spring容器來進行管理
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
try {
/**
* 設定StatFilter,用于統計監控資訊。
* StatFilter的别名是stat
*/
datasource.setFilters(filters);
} catch (SQLException e) {
System.err.println("druid configuration initialization filter: "+ e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
}
3. 配置監控統計功能 (在上面建立的config包下建立一個配置類,此處有兩種寫法,兩種寫法任選其一:1.用@bean注解 2.用其他注解)
第一種方式:
package com.hokai.config;
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 com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
@Configuration
public class DruidMonitorConfig {
/**
* 注冊ServletRegistrationBean
* @return
*/
@Bean
public ServletRegistrationBean registrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
/** 初始化參數配置,initParams**/
//白名單
//bean.addInitParameter("allow", "127.0.0.1");//多個ip逗号隔開
//IP黑名單 (存在共同時,deny優先于allow)
//bean.addInitParameter("deny", "192.168.1.73");
//登入檢視資訊的賬号密碼.
bean.addInitParameter("loginUsername", "admin");
bean.addInitParameter("loginPassword", "123456");
//是否能夠重置資料.
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;
}
}
第二種方式:(建立 DruidStatFilter 和 DruidStatViewServlet 兩個類)
package com.hokai.config;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import com.alibaba.druid.support.http.WebStatFilter;
/**
* WebStatFilter用于采集web-jdbc關聯監控的資料。
* 屬性filterName聲明過濾器的名稱,(可選用)
* 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來聲明.(指定要過濾的URL模式是必選屬性)
*/
@WebFilter(filterName="druidWebStatFilter",
urlPatterns="/*",
initParams={
@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略資源
})
// 第二種方式的DruidStatFilter 類
public class DruidStatFilter extends WebStatFilter{
}
//-----------------------------------------------------------------
package com.hokai.config;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import com.alibaba.druid.support.http.StatViewServlet;
/**
* StatViewServlet用于展示Druid的統計資訊。
* 提供監控資訊展示的html頁面
* 提供監控資訊的JSON API
*
* 内置監控頁面的首頁是/druid/index.html
*/
/**
* @Webservlet
* 有兩個屬性可以用來表示Servlet的通路路徑,分别是value和urlPatterns。value和urlPatterns都是數組形式,
* 表示我們可以把一個Servlet映射到多個通路路徑,但是value和urlPatterns不能同時使用。
*/
@WebServlet(urlPatterns = "/druid/*",
initParams={
@WebInitParam(name="allow",value=""),// IP白名單 (沒有配置或者為空,則允許所有通路)
@WebInitParam(name="deny",value="192.168.16.111"),// IP黑名單 (存在共同時,deny優先于allow)
@WebInitParam(name="loginUsername",value="admin"),// 使用者名
@WebInitParam(name="loginPassword",value="admin"),// 密碼
@WebInitParam(name="resetEnable",value="true")// 禁用HTML頁面上的“Reset All”功能
})
// 第二種方式的DruidStatViewServlet 類
public class DruidStatViewServlet extends StatViewServlet {
private static final long serialVersionUID = 1L;
}
4. 以上全部配置完成後,我們可以啟動項目來進行通路測試
4.1 打開浏覽器輸入路徑: http://localhost:8088/druid/login.html(如果程式中設定了過濾器或攔截器需要将 /druid/**路徑放開)
4.2 登入頁面中輸入我們在配置類中設定的賬号密碼進入Druid監控背景
4.3 登入成功以後,可以看到Druid首頁面,但是我們點選 資料源頁籤(展示我們在application.properties中配置的那些參數)、SQL監控頁籤(監控并展示程式每次請求時運作的SQL語句)、SQL防火牆頁籤等可能看不到資料,這個是正常情況,sping boot 啟動的時候沒有進行資料庫操作(也就是說程式不會主動與資料庫進行連接配接互動操作,隻有使用者操作頁面送出請求了,程式才會與資料庫進行互動,如果程式已經和資料庫有互動了,那麼我們就能在資料源、SQL監控等頁面看到Druid統計的監控資料了),是以這裡就是這樣。紅色div塊一直存在,是Druid代碼裡寫死的;
4.4 我們先在頁面執行一個操作與資料庫互動後,可以在sql監控頁籤看到執行的sql等資訊了
4.5 再檢視資料源頁籤可以看到配置連接配接池參數也都生效了
注:4.4 和4.5 對4.3括号中的内容意思一緻,隻有與資料庫互動了,Druid就能做資料庫的監控了