2024.5.14 Tuesday
目錄
- 12.整合Druid數據源
- 12.1.Druid簡介
- 12.2.配置數據源
- 12.2.1.添加Druid數據源依賴
- 12.2.2.切換數據源
- 12.2.3.運行Springboot04DataApplicationTests.java
- 12.2.4.嘗試使用Druid數據源的專有配置
- 12.2.5.導入Log4j 的依賴
- 12.2.6.新建config文件夾
- 12.2.7.修改測試類并運行檢查配置參數是否生效
- 12.3.配置Druid數據源監控
- 12.3.1.修改DruidConfig.java
- 12.3.2.重啟并訪問http://localhost:8080/druid
- 12.3.3.配置Druid web監控filter過濾器
12.整合Druid數據源
12.1.Druid簡介
Java程序很大一部分要操作數據庫,為了提高性能操作數據庫的時候,又不得不使用數據庫連接池。
Druid 是阿里巴巴開源平臺上一個數據庫連接池實現,結合了 C3P0、DBCP 等 DB 池的優點,同時加入了日志監控。
Druid 可以很好的監控 DB 池連接和 SQL 的執行情況,天生就是針對監控而生的 DB 連接池。
Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。
Spring Boot 2.0 以上默認使用 Hikari 數據源,可以說 Hikari 與 Driud 都是當前 Java Web 上最優秀的數據源,我們來重點介紹 Spring Boot 如何集成 Druid 數據源,如何實現數據庫監控。
Github地址:https://github.com/alibaba/druid/
com.alibaba.druid.pool.DruidDataSource 基本配置參數如下:
12.2.配置數據源
12.2.1.添加Druid數據源依賴
https://mvnrepository.com/artifact/com.alibaba/druid/1.1.21
修改pom.xml,在dependencies中添加這段依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.13</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-04-data</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-04-data</name><description>springboot-04-data</description><properties><java.version>8</java.version></properties><dependencies><!--Druid--><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.21</version></dependency><!--JDBC--><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><!--MySQL--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
重啟maven進行下載,可以點開源碼查看
12.2.2.切換數據源
修改application.yaml
spring:datasource:username: rootpassword: 123456#假如時區報錯,就增加一個時區的配置,和其他配置用&連接,如:serverTimezone=UTCurl: jdbc:mysql://localhost:3306/p37jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
12.2.3.運行Springboot04DataApplicationTests.java
此時默認數據源已經改變,但是數據庫底層仍然是JDBC:
12.2.4.嘗試使用Druid數據源的專有配置
修改修改application.yaml
spring:datasource:username: rootpassword: 123456#假如時區報錯,就增加一個時區的配置,和其他配置用&連接,如:serverTimezone=UTCurl: jdbc:mysql://localhost:3306/p37jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource#Spring Boot 默認是不注入這些屬性值的,需要自己綁定#druid 數據源專有配置initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true#配置監控統計攔截的filters,stat:監控統計; log4j:日志記錄; wall:防御sql注入#如果允許時報錯 java.lang.ClassNotFoundException: org.apache.log4j.Priority#則導入 log4j 依賴即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4jfilters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
12.2.5.導入Log4j 的依賴
在pom.xml
中添加依賴
<!--log4j-->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
12.2.6.新建config文件夾
現在需要程序員自己為 DruidDataSource 綁定全局配置文件中的參數,再添加到容器中,而不再使用 Spring Boot 的自動生成了;我們需要 自己添加 DruidDataSource 組件到容器中,并綁定屬性;
新建DruidConfig.java
package com.P31.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration
public class DruidConfig {/*將自定義的 Druid數據源添加到容器中,不再讓 Spring Boot 自動創建綁定全局配置文件中的 druid 數據源屬性到 com.alibaba.druid.pool.DruidDataSource從而讓它們生效@ConfigurationProperties(prefix = "spring.datasource"):作用就是將 全局配置文件中前綴為 spring.datasource的屬性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名參數中*/@ConfigurationProperties(prefix = "spring.datasource") //綁定@Beanpublic DataSource druidDataSource(){return new DruidDataSource();}
}
12.2.7.修改測試類并運行檢查配置參數是否生效
Springboot04DataApplicationTests.java
package com.P31;import com.alibaba.druid.pool.DruidDataSource;
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 Springboot04DataApplicationTests {@AutowiredDataSource dataSource;@Testvoid contextLoads() throws SQLException {//查看默認的數據源System.out.println(dataSource.getClass());//獲取數據庫連接Connection connection = dataSource.getConnection();System.out.println(connection);DruidDataSource druidDataSource = (DruidDataSource) dataSource;System.out.println("druidDataSource 數據源最大連接數:" + druidDataSource.getMaxActive());System.out.println("druidDataSource 數據源初始化連接數:" + druidDataSource.getInitialSize());//關閉connection.close();}}
12.3.配置Druid數據源監控
Druid數據源具有監控的功能,而且提供了一個web頁面便于查看。
12.3.1.修改DruidConfig.java
package com.P31.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;
import java.util.HashMap;@Configuration
public class DruidConfig {/*將自定義的 Druid數據源添加到容器中,不再讓 Spring Boot 自動創建綁定全局配置文件中的 druid 數據源屬性到 com.alibaba.druid.pool.DruidDataSource從而讓它們生效@ConfigurationProperties(prefix = "spring.datasource"):作用就是將 全局配置文件中前綴為 spring.datasource的屬性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名參數中*/@ConfigurationProperties(prefix = "spring.datasource") //綁定@Beanpublic DataSource druidDataSource(){return new DruidDataSource();}//后臺監控//配置 Druid 監控管理后臺的Servlet;//因為SpringBoot內置了Servlet容器,所以沒有web.xml文件,所以使用Spring Boot的注冊Servlet方式(ServletRegistrationBean)@Beanpublic ServletRegistrationBean statViewServlet(){ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");//后臺需要有人登錄,賬號密碼配置//點開setInitParameters查看源碼,可以看到他需要的參數:public void setInitParameters(Map<String, String> initParameters)HashMap<String,String> initParameters = new HashMap<>();//這些參數可以在 com.alibaba.druid.support.http.StatViewServlet的父類 com.alibaba.druid.support.http.ResourceServlet 中找到//增加配置//loginUsername loginPassword是固定參數initParameters.put("loginUsername","admin"); //后臺管理界面的登錄賬號initParameters.put("loginPassword","123456"); //后臺管理界面的登錄密碼//允許可以訪問的用戶initParameters.put("allow",""); //為空則所有人都可以訪問//initParams.put("allow", "localhost"):表示只有本機可以訪問//initParams.put("allow", ""):為空或者為null時,表示允許所有訪//禁止訪問的用戶//deny:Druid 后臺拒絕誰訪問//initParams.put("kuangshen", "192.168.1.20");表示禁止此ip訪問bean.setInitParameters(initParameters); //設置初始化參數return bean;}
}
12.3.2.重啟并訪問http://localhost:8080/druid
將自動跳轉到http://localhost:8080/druid/login.html
登錄參數錯誤:
成功登錄:
跳轉到:
運行http://localhost:8080/userList,點擊導航欄中的“SQL監控”可見:
也可查看SQL防火墻:
12.3.3.配置Druid web監控filter過濾器
package com.P31.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 javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;@Configuration
public class DruidConfig {/*將自定義的 Druid數據源添加到容器中,不再讓 Spring Boot 自動創建綁定全局配置文件中的 druid 數據源屬性到 com.alibaba.druid.pool.DruidDataSource從而讓它們生效@ConfigurationProperties(prefix = "spring.datasource"):作用就是將 全局配置文件中前綴為 spring.datasource的屬性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名參數中*/@ConfigurationProperties(prefix = "spring.datasource") //綁定@Beanpublic DataSource druidDataSource(){return new DruidDataSource();}//后臺監控//配置 Druid 監控管理后臺的Servlet;//因為SpringBoot內置了Servlet容器,所以沒有web.xml文件,所以使用Spring Boot的注冊Servlet方式(ServletRegistrationBean)@Beanpublic ServletRegistrationBean statViewServlet(){ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");//后臺需要有人登錄,賬號密碼配置//點開setInitParameters查看源碼,可以看到他需要的參數:public void setInitParameters(Map<String, String> initParameters)HashMap<String,String> initParameters = new HashMap<>();//這些參數可以在 com.alibaba.druid.support.http.StatViewServlet的父類 com.alibaba.druid.support.http.ResourceServlet 中找到//增加配置//loginUsername loginPassword是固定參數initParameters.put("loginUsername","admin"); //后臺管理界面的登錄賬號initParameters.put("loginPassword","123456"); //后臺管理界面的登錄密碼//允許可以訪問的用戶initParameters.put("allow",""); //為空則所有人都可以訪問//initParams.put("allow", "localhost"):表示只有本機可以訪問//initParams.put("allow", ""):為空或者為null時,表示允許所有訪//禁止訪問的用戶//deny:Druid 后臺拒絕誰訪問//initParams.put("kuangshen", "192.168.1.20");表示禁止此ip訪問bean.setInitParameters(initParameters); //設置初始化參數return bean;}//filter//配置 Druid 監控 之 web 監控的 filter//WebStatFilter:用于配置Web和Druid數據源之間的管理關聯監控統計@Beanpublic FilterRegistrationBean webStatFilter(){FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new WebStatFilter());//exclusions:設置哪些請求被過濾(排除)->不進行統計Map<String,String> initParameters = new HashMap<>();initParameters.put("exclusions","*.js,*.css,/druid/*,/jdbc/*");bean.setInitParameters(initParameters);//"/*" 表示過濾所有請求bean.setUrlPatterns(Arrays.asList("/*"));return bean;}
}
按需配置即可。