最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot集成Druid實(shí)現(xiàn)數(shù)據(jù)源管理與監(jiān)控的詳細(xì)步驟

 更新時(shí)間:2025年07月09日 11:15:02   作者:夜影風(fēng)  
本文介紹如何在SpringBoot項(xiàng)目中集成Druid數(shù)據(jù)庫連接池,包括環(huán)境搭建、Maven依賴配置、SpringBoot配置文件設(shè)置及自定義配置,最后演示如何查看Druid監(jiān)控信息,感興趣的朋友一起看看吧

1. 引言

在程序員的日常工作中, 經(jīng)常需要編寫數(shù)據(jù)庫操作相關(guān)的程序,而這就需要數(shù)據(jù)連接池中間件用于管理數(shù)據(jù)庫連接。數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。通過數(shù)據(jù)庫連接池能明顯提高對數(shù)據(jù)庫操作的性能。在Java應(yīng)用程序開發(fā)中,常用的連接池有DBCP、C3P0、Proxool等。

而在Spring Boot開發(fā)框架下,它默認(rèn)提供了若干種可用的連接池,其中包括Druid連接池(來自于阿里系的一個(gè)開源連接池),除在連接池之外,Druid還提供了非常優(yōu)秀的數(shù)據(jù)庫監(jiān)控和擴(kuò)展功能。在此,根據(jù)項(xiàng)目實(shí)踐中的應(yīng)用,講解如何實(shí)現(xiàn)Spring Boot與Druid連接池的集成。

1.1 環(huán)境準(zhǔn)備

  • JDK 1.8
  • Spring Boot 2.0.0.RELEASE
  • MySQL 5.7
  • Druid 1.1.9

1.2 Druid介紹

Druid是阿里開源的一個(gè)JDBC應(yīng)用組件, 其包括三部分:

  • DruidDriver 代理Driver,能夠提供基于Filter-Chain模式的插件體系。
  • DruidDataSource 高效可管理的數(shù)據(jù)庫連接池。
  • SQLParser SQL語法分析

通過Druid連接池中間件, 我們可以實(shí)現(xiàn):

  • 可以監(jiān)控?cái)?shù)據(jù)庫訪問性能,Druid內(nèi)置提供了一個(gè)功能強(qiáng)大的StatFilter插件,能夠詳細(xì)統(tǒng)計(jì)SQL的執(zhí)行性能,這對于線上分析數(shù)據(jù)庫訪問性能有幫助。
  • 替換傳統(tǒng)的DBCP和C3P0連接池中間件。Druid提供了一個(gè)高效、功能強(qiáng)大、可擴(kuò)展性好的數(shù)據(jù)庫連接池。
  • 數(shù)據(jù)庫密碼加密。直接把數(shù)據(jù)庫密碼寫在配置文件中,這是不好的行為,容易導(dǎo)致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
  • SQL執(zhí)行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應(yīng)的LogFilter,監(jiān)控你應(yīng)用的數(shù)據(jù)庫訪問情況。
  • 擴(kuò)展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter-Chain機(jī)制,很方便編寫JDBC層的擴(kuò)展插件。

關(guān)于Druid的更多詳細(xì)信息可以參考Druid官方文檔

2. 配置Druid連接池

(1) 添加Maven依賴

<dependencies>
      ... 此處省略其他配置 ...
      <!-- Configuration Module -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
      </dependency>
      <!-- MySQL Driver -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.45</version>
            <scope>runtime</scope>
      </dependency>
      <!-- Druid Pool -->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.9</version>
      </dependency>
      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
      </dependency>
</dependencies>

(2) Spring Boot配置文件配置

Spring Boot配置文件有application.properties和application.yml兩種配置文件方式 , 此處采用的是application.yml的配置方式。

# Spring Datasource Settings
spring:
  datasource:
    name: druidDataSource
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.202.17:3306/auth_service?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
      username: root
      password: 123456
      filters: stat,wall,log4j,config
      max-active: 100
      initial-size: 1
      max-wait: 60000
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 50
      max-pool-prepared-statement-per-connection-size: 20

說明:
- spring.datasource.druid.max-active 最大連接數(shù)
- spring.datasource.druid.initial-size 初始化大小
- spring.datasource.druid.min-idle 最小連接數(shù)
- spring.datasource.druid.max-wait 獲取連接等待超時(shí)時(shí)間
- spring.datasource.druid.time-between-eviction-runs-millis 間隔多久才進(jìn)行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
- spring.datasource.druid.min-evictable-idle-time-millis 一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
- spring.datasource.druid.filters=config,stat,wall,log4j 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面SQL無法進(jìn)行統(tǒng)計(jì),’wall’用于防火墻

Druid提供以下幾種Filter信息:

Filter類名別名
defaultcom.alibaba.druid.filter.stat.StatFilter
statcom.alibaba.druid.filter.stat.StatFilter
mergeStatcom.alibaba.druid.filter.stat.MergeStatFilter
encodingcom.alibaba.druid.filter.encoding.EncodingConvertFilter
log4jcom.alibaba.druid.filter.logging.Log4jFilter
log4j2com.alibaba.druid.filter.logging.Log4j2Filter
slf4jcom.alibaba.druid.filter.logging.Slf4jLogFilter
commonloggingcom.alibaba.druid.filter.logging.CommonsLogFilter
wallcom.alibaba.druid.wall.WallFilter

(3) Druid配置信息定制

通過Druid-Spring-Boot-Starter可以自動完成相關(guān)的配置, 而無須自定義配置文件, 具體參考Druid-Spring-Boot-Starter。

通過Druid-Spring-Boot-Starter的Spring Boot配置信息示例:

spring:
  datasource:
    name: druidDataSource
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.202.17:3306/auth_service?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
    username: root
    password: 123456
    druid:
      filters: stat,wall,log4j,config
      max-active: 100
      initial-size: 1
      max-wait: 60000
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 50
      max-pool-prepared-statement-per-connection-size: 20

在此, 主要通過定制的配置文件對Druid進(jìn)行自定義屬性配置, 配置文件如下:

package com.garyond.hurricane.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidDataSourceProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private int initialSize;
    private int minIdle;
    private int maxActive = 100;
    private long maxWait;
    private long timeBetweenEvictionRunsMillis;
    private long minEvictableIdleTimeMillis;
    private String validationQuery;
    private boolean testWhileIdle;
    private boolean testOnBorrow;
    private boolean testOnReturn;
    private boolean poolPreparedStatements;
    private int maxPoolPreparedStatementPerConnectionSize;
    private String filters;
    public int getInitialSize() {
        return initialSize;
    }
    public void setInitialSize(int initialSize) {
        this.initialSize = initialSize;
    }
    public int getMinIdle() {
        return minIdle;
    }
    public void setMinIdle(int minIdle) {
        this.minIdle = minIdle;
    }
    public int getMaxActive() {
        return maxActive;
    }
    public void setMaxActive(int maxActive) {
        this.maxActive = maxActive;
    }
    public long getMaxWait() {
        return maxWait;
    }
    public void setMaxWait(long maxWait) {
        this.maxWait = maxWait;
    }
    public long getTimeBetweenEvictionRunsMillis() {
        return timeBetweenEvictionRunsMillis;
    }
    public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
        this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
    }
    public long getMinEvictableIdleTimeMillis() {
        return minEvictableIdleTimeMillis;
    }
    public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
        this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
    }
    public String getValidationQuery() {
        return validationQuery;
    }
    public void setValidationQuery(String validationQuery) {
        this.validationQuery = validationQuery;
    }
    public boolean isTestWhileIdle() {
        return testWhileIdle;
    }
    public void setTestWhileIdle(boolean testWhileIdle) {
        this.testWhileIdle = testWhileIdle;
    }
    public boolean isTestOnBorrow() {
        return testOnBorrow;
    }
    public void setTestOnBorrow(boolean testOnBorrow) {
        this.testOnBorrow = testOnBorrow;
    }
    public boolean isTestOnReturn() {
        return testOnReturn;
    }
    public void setTestOnReturn(boolean testOnReturn) {
        this.testOnReturn = testOnReturn;
    }
    public boolean isPoolPreparedStatements() {
        return poolPreparedStatements;
    }
    public void setPoolPreparedStatements(boolean poolPreparedStatements) {
        this.poolPreparedStatements = poolPreparedStatements;
    }
    public int getMaxPoolPreparedStatementPerConnectionSize() {
        return maxPoolPreparedStatementPerConnectionSize;
    }
    public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
        this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
    }
    public String getFilters() {
        return filters;
    }
    public void setFilters(String filters) {
        this.filters = filters;
    }
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

(3) 配置Druid相關(guān)的Servlet和Filter

package com.garyond.hurricane.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.sql.SQLException;
@Configuration
@EnableConfigurationProperties({DruidDataSourceProperties.class})
public class DruidConfig {
    @Autowired
    private DruidDataSourceProperties properties;
    @Bean
    @ConditionalOnMissingBean
    public DataSource druidDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(properties.getDriverClassName());
        druidDataSource.setUrl(properties.getUrl());
        druidDataSource.setUsername(properties.getUsername());
        druidDataSource.setPassword(properties.getPassword());
        druidDataSource.setInitialSize(properties.getInitialSize());
        druidDataSource.setMinIdle(properties.getMinIdle());
        druidDataSource.setMaxActive(properties.getMaxActive());
        druidDataSource.setMaxWait(properties.getMaxWait());
        druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
        druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
        druidDataSource.setValidationQuery(properties.getValidationQuery());
        druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
        druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
        druidDataSource.setTestOnReturn(properties.isTestOnReturn());
        druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
        druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
        try {
            druidDataSource.setFilters(properties.getFilters());
            druidDataSource.init();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return druidDataSource;
    }
    /**
     * 注冊Servlet信息, 配置監(jiān)控視圖
     *
     * @return
     */
    @Bean
    @ConditionalOnMissingBean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        //白名單:
        servletRegistrationBean.addInitParameter("allow","192.168.6.195");
        //IP黑名單 (存在共同時(shí),deny優(yōu)先于allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter("deny","192.168.6.73");
        //登錄查看信息的賬號密碼, 用于登錄Druid監(jiān)控后臺
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "admin");
        //是否能夠重置數(shù)據(jù).
        servletRegistrationBean.addInitParameter("resetEnable", "true");
        return servletRegistrationBean;
    }
    /**
     * 注冊Filter信息, 監(jiān)控?cái)r截器
     *
     * @return
     */
    @Bean
    @ConditionalOnMissingBean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

注:
- @EnableConfigurationProperties({DruidDataSourceProperties.class}) 用于導(dǎo)入上一步Druid的配置信息
- public ServletRegistrationBean druidServlet() 相當(dāng)于Web Servlet配置
- public FilterRegistrationBean filterRegistrationBean() 相當(dāng)于Web Filter配置

如果不使用上述的Servlet和Filter配置, 也可以通過下述監(jiān)控器配置實(shí)現(xiàn):

配置監(jiān)控?cái)r截器(相當(dāng)于FilterRegistrationBean)

/**   
 * 配置監(jiān)控?cái)r截器, druid監(jiān)控?cái)r截器   
 * @ClassName: DruidStatFilter    
 * @author garyond
 * @date 2018年4月24日
 */    
@WebFilter(filterName="druidWebStatFilter",    
urlPatterns="/*",    
initParams={    
    @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略資源    
})   
public class DruidStatFilter extends WebStatFilter {  
}  

配置Druid監(jiān)控視圖(相當(dāng)于ServletRegistrationBean)

/**   
 * druid監(jiān)控視圖配置   
 *
 * @ClassName: DruidStatViewServlet    
 * @author garyond  
 * @date 2018年4月24日 
 */    
@WebServlet(urlPatterns = "/druid/*", initParams={    
    @WebInitParam(name="allow",value="192.168.6.195"),// IP白名單 (沒有配置或者為空,則允許所有訪問)    
    @WebInitParam(name="deny",value="192.168.6.73"),// IP黑名單 (存在共同時(shí),deny優(yōu)先于allow)    
    @WebInitParam(name="loginUsername",value="admin"),// 用戶名    
    @WebInitParam(name="loginPassword",value="admin"),// 密碼    
    @WebInitParam(name="resetEnable",value="true")// 禁用HTML頁面上的“Reset All”功能    
})   
public class DruidStatViewServlet extends StatViewServlet {  
    private static final long serialVersionUID = 7359758657306626394L;  
}  

3. 查看Druid監(jiān)控

配置完成后, 并完成相關(guān)的數(shù)據(jù)庫操作配置, 啟動Spring Boot應(yīng)用程序,就可以通過訪問: http://localhost:8080/druid/index.html 訪問Druid監(jiān)控后臺頁面。

輸入用戶名和密碼可以查看Druid監(jiān)控信息:

至此, Spring Boot集成Druid連接池已配置完畢。

到此這篇關(guān)于Spring Boot集成Druid實(shí)現(xiàn)數(shù)據(jù)源管理與監(jiān)控的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)Spring Boot Druid數(shù)據(jù)源管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot彩色日志配置方式

    SpringBoot彩色日志配置方式

    這篇文章主要介紹了SpringBoot彩色日志配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 基于@GetMapping注解攜帶參數(shù)的方式

    基于@GetMapping注解攜帶參數(shù)的方式

    這篇文章主要介紹了基于@GetMapping注解攜帶參數(shù)的方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 2023最新版本idea用maven新建web項(xiàng)目(親測不報(bào)錯(cuò))

    2023最新版本idea用maven新建web項(xiàng)目(親測不報(bào)錯(cuò))

    這篇文章主要給大家介紹了關(guān)于2023最新版本idea用maven新建web項(xiàng)目,Maven是當(dāng)今Java開發(fā)中主流的依賴管理工具,文中介紹的步驟親測不報(bào)錯(cuò),需要的朋友可以參考下
    2023-07-07
  • Java如何獲取List<String>中的String詳解

    Java如何獲取List<String>中的String詳解

    工作了這么長時(shí)間了,一直沒有記錄的習(xí)慣,以至于導(dǎo)致我即便是查過的東西總會忘記,下面這篇文章主要給大家介紹了關(guān)于Java如何獲取List<String>中String的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法

    Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法

    這篇文章主要介紹了Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java中循環(huán)冗余校驗(yàn)(CRC32)的實(shí)現(xiàn)

    Java中循環(huán)冗余校驗(yàn)(CRC32)的實(shí)現(xiàn)

    CRC校驗(yàn)實(shí)用程序庫在數(shù)據(jù)存儲和數(shù)據(jù)通訊領(lǐng)域,為了保證數(shù)據(jù)的正確,就不得不采用檢錯(cuò)的手段,下面這篇文章主要給大家介紹了關(guān)于Java中循環(huán)冗余校驗(yàn)(CRC32)實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • swagger2和knife4j的詳細(xì)使用教程(入門級)

    swagger2和knife4j的詳細(xì)使用教程(入門級)

    最近項(xiàng)目中用到了Swagger2和knife4j作為接口文檔,所以下面這篇文章主要給大家介紹了關(guān)于swagger2和knife4j的詳細(xì)使用教程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java全面細(xì)致講解final的使用

    Java全面細(xì)致講解final的使用

    關(guān)于final關(guān)鍵字,它也是我們一個(gè)經(jīng)常用的關(guān)鍵字,可以修飾在類上、或者修飾在變量、方法上,以此看來定義它的一些不可變性!像我們經(jīng)常使用的String類中,它便是final來修飾的類,并且它的字符數(shù)組也是被final所修飾的。但是一些final的一些細(xì)節(jié)你真的了解過嗎
    2022-05-05
  • Java?中的泛型超全詳解

    Java?中的泛型超全詳解

    這篇文章主要介紹了泛型的概念、使用場景、泛型類、泛型方法、泛型接口、類型擦除以及泛型通配符,泛型是一種強(qiáng)大的工具,可以幫助我們編寫更安全和更通用的代碼,感興趣的朋友一起看看吧
    2025-03-03
  • Java接口的本質(zhì)解析

    Java接口的本質(zhì)解析

    Java接口是初學(xué)者必須經(jīng)歷的基礎(chǔ),但初學(xué)之時(shí)肯定不會完全懂,溫故而知新本篇文章就帶你重拾接口全面掌握
    2022-03-03

最新評論

尼玛县| 中方县| 虎林市| 安阳市| 全椒县| 康乐县| 深泽县| 长泰县| 会宁县| 镇康县| 旺苍县| 罗甸县| 原平市| 苏尼特右旗| 蓬莱市| 贵南县| 如皋市| 隆林| 祁东县| 桂平市| 若羌县| 宾川县| 光山县| 衡水市| 庄浪县| 樟树市| 温宿县| 荣成市| 温泉县| 北辰区| 木兰县| 黄平县| 承德县| 紫阳县| 义马市| 姜堰市| 得荣县| 抚宁县| 富蕴县| 手机| 延寿县|