SpringBoot 集成 Druid
- 前言
- 創建項目
- 修改 pom.xml 文件
- 添加配置文件
- 開發 java 代碼
- 啟動類 - DruidApplication
- 配置文件-properties
- DruidConfigProperty
- DruidMonitorProperty
- 配置文件-config
- DruidConfig
- 控制層
- DruidController
- 運行
- 驗證
- Druid 的監控
- 應用程序
前言
JDK版本:1.8
Maven版本:3.8.1
操作系統:Win10
SpringBoot版本:2.3.12.RELEAS
- 當前 Springboot 版本選用
2.3.12.RELEASE
,關于版本的選擇,這里先說明下,后續不在重復說明。 - 我日常微服務項目技術棧用到
Spring Cloud Alibaba
版本選用的是2.2.8.release
,而此版本對應的SpringBoot版本官方建議是2.3.12.RELEASE
,故Spring Boot系列項目也通用使用2.2.8.release
創建項目
File
=>New
=>Project
- 選擇:Maven(注意:IDEA工具已經提前配置好了Maven、JDK等)
- 填寫屬性,這里主要更改了:Name、GroupId,最后點擊
Finish
按鈕即可。
由于junjiu-springboot-druid
已經創建完成,這里筆記時,故寫成了jj-springboot-druid
后續筆記中使用的是junjiu-springboot-druid
(只是一個項目名字,問題不大)
項目創建完成之后,如下:
修改 pom.xml 文件
這里主要是引用包、版本等。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.3.12.RELEASE</version><relativePath /></parent><groupId>com.junjiu.springboot.druid</groupId><artifactId>junjiu-springboot-druid</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><mysql.connector.java.version>8.0.28</mysql.connector.java.version><mybatis.plus.boot.starter.version>3.3.1</mybatis.plus.boot.starter.version><druid.version>1.2.13</druid.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MySQL驅動依賴. --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.connector.java.version}</version></dependency><!-- mybatis-plus 依賴https://baomidou.com/getting-started/--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version> ${mybatis.plus.boot.starter.version} </version></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- lombok 依賴 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>
添加配置文件
在resources目錄中創建application.yml
配置文件
配置文件內容如下:
# 端口
server:port: 5826spring:application:# 應用名稱name: junjiu-springboot-druiddatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.88.54:3306/ideadb?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: fid_ideapassword: 123456initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000max-evictable-idle-time-millis: 600000validation-query: SELECT 1 FROM DUAL# validation-query-timeout: 5000test-on-borrow: falsetest-on-return: falsetest-while-idle: trueconnection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000#filters: #配置多個英文逗號分隔(統計,sql注入,log4j過濾)filters: stat,wallstat-view-servlet:enabled: trueurl-pattern: /druid/*# 監控頁面配置.
jj:druid:monitor:login-username: rootlogin-password: 123456reset-enable: false
開發 java 代碼
當前項目的建設,主要兩個原因:
- 研究
MySQL8.x
版本中的性能庫performance_schema,例如:threads
、processlist
等視圖。 - SpringBoot 項目集成 Druid,做個筆記。
項目中將可能缺少業務層、持久層等目錄結構。
項目代碼結構如下:
啟動類 - DruidApplication
package com.junjiu.springboot.druid;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** program: junjiu-springboot-druid* ClassName: DruidApplication* description:** @author: 君九* @create: 2024-05-26 13:13* @version: 1.0**/
@SpringBootApplication
public class DruidApplication {public static void main(String[] args) {SpringApplication.run(DruidApplication.class);}
}
配置文件-properties
DruidConfigProperty
package com.junjiu.springboot.druid.config.properties;import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** program: junjiu-springboot-druid* ClassName: DruidConfigProperty* description:** @author: 君九* @create: 2024-05-26 13:19* @version: 1.0**/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidConfigProperty {private String url;private String username;private String password;private String driverClassName;private int initialSize;private int maxActive;private int minIdle;private int maxWait;private boolean poolPreparedStatements;private int maxPoolPreparedStatementPerConnectionSize;private int timeBetweenEvictionRunsMillis;private int minEvictableIdleTimeMillis;private int maxEvictableIdleTimeMillis;private String validationQuery;private boolean testWhileIdle;private boolean testOnBorrow;private boolean testOnReturn;private String filters;private String connectionProperties;}
DruidMonitorProperty
package com.junjiu.springboot.druid.config.properties;import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** program: junjiu-springboot-druid* ClassName: DruidMonitorProperty* description:** @author: 君九* @create: 2024-05-26 13:27* @version: 1.0**/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "jj.druid.monitor")
public class DruidMonitorProperty {private String loginUsername;private String loginPassword;private String resetEnable;}
配置文件-config
DruidConfig
package com.junjiu.springboot.druid.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.junjiu.springboot.druid.config.properties.DruidConfigProperty;
import com.junjiu.springboot.druid.config.properties.DruidMonitorProperty;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.jdbc.core.JdbcTemplate;/*** program: junjiu-springboot-druid* ClassName: DruidConfig* description: Druid 配置文件** @author: 君九* @create: 2024-05-26 13:16* @version: 1.0**/
@Configuration
public class DruidConfig {@AutowiredDruidConfigProperty druidConfigProperty;@AutowiredDruidMonitorProperty druidMonitorProperty;/*** Druid 連接池配置*/@Beanpublic DruidDataSource dataSource() {DruidDataSource datasource = new DruidDataSource();datasource.setUrl(druidConfigProperty.getUrl());datasource.setUsername(druidConfigProperty.getUsername());datasource.setPassword(druidConfigProperty.getPassword());datasource.setDriverClassName(druidConfigProperty.getDriverClassName());datasource.setInitialSize(druidConfigProperty.getInitialSize());datasource.setMinIdle(druidConfigProperty.getMinIdle());datasource.setMaxActive(druidConfigProperty.getMaxActive());datasource.setMaxWait(druidConfigProperty.getMaxWait());datasource.setTimeBetweenEvictionRunsMillis(druidConfigProperty.getTimeBetweenEvictionRunsMillis());datasource.setMinEvictableIdleTimeMillis(druidConfigProperty.getMinEvictableIdleTimeMillis());datasource.setMaxEvictableIdleTimeMillis(druidConfigProperty.getMaxEvictableIdleTimeMillis());datasource.setValidationQuery(druidConfigProperty.getValidationQuery());datasource.setTestWhileIdle(druidConfigProperty.isTestWhileIdle());datasource.setTestOnBorrow(druidConfigProperty.isTestOnBorrow());datasource.setTestOnReturn(druidConfigProperty.isTestOnReturn());datasource.setPoolPreparedStatements(druidConfigProperty.isPoolPreparedStatements());datasource.setMaxPoolPreparedStatementPerConnectionSize(druidConfigProperty.getMaxPoolPreparedStatementPerConnectionSize());try {datasource.setFilters(druidConfigProperty.getFilters());} catch (Exception ex) {ex.printStackTrace();}datasource.setConnectionProperties(druidConfigProperty.getConnectionProperties());return datasource;}/*** JDBC操作配置*/@Beanpublic JdbcTemplate jdbcTemplate (@Autowired DruidDataSource dataSource){return new JdbcTemplate(dataSource) ;}/*** 配置 Druid 監控界面*/@Beanpublic ServletRegistrationBean statViewServlet(){ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");//設置控制臺管理用戶servletRegistrationBean.addInitParameter("loginUsername",druidMonitorProperty.getLoginUsername());servletRegistrationBean.addInitParameter("loginPassword",druidMonitorProperty.getLoginPassword());// 是否可以重置數據servletRegistrationBean.addInitParameter("resetEnable",druidMonitorProperty.getResetEnable());return servletRegistrationBean;}@Beanpublic FilterRegistrationBean statFilter(){//創建過濾器FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());//設置過濾器過濾路徑filterRegistrationBean.addUrlPatterns("/*");//忽略過濾的形式filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return filterRegistrationBean;}}
控制層
DruidController
package com.junjiu.springboot.druid.controller;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;/*** program: junjiu-springboot-druid* ClassName: DruidController* description:** @author: 君九* @create: 2024-05-26 13:32* @version: 1.0**/
@RestController
public class DruidController {@Resourceprivate JdbcTemplate jdbcTemplate;@Autowiredprivate DruidDataSource druidDataSource;/*** 測試 Druid* @return*/@GetMapping("/test")public String testDruid() {String sql = "select version()";String result = jdbcTemplate.queryForObject(sql, String.class);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");return "Success.".concat(simpleDateFormat.format(new Date())).concat(":").concat(result);}/*** 測試連接池.* 查看 performance_schema.threads 情況.* @param size* @return*/@GetMapping("/mutix/{size}")public String testDruidMutix(@PathVariable("size") Integer size) {for(int k = 0; k < size; k++) {new Thread(() -> {String sql = "select version()";String result = jdbcTemplate.queryForObject(sql, String.class);System.out.println(Thread.currentThread().getName() + ":" + result);}).start();}SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");return "Success.".concat(simpleDateFormat.format(new Date()));}
}
運行
在 DruidApplication
類中,進行啟動。
驗證
Druid 的監控
在地址欄訪問:http://localhost:5826/druid/
打開如下頁面,輸入配置中的賬號、密碼,即可訪問。
應用程序
根據控制層代碼訪問路徑,在瀏覽器地址欄中訪問:
http://localhost:5826/test
,如下將會有返回。