日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot下Druid连接池的使用配置分析

發布時間:2025/5/22 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot下Druid连接池的使用配置分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言: 在Spring Boot下默認提供了若干種可用的連接池,Druid來自于阿里系的一個開源連接池,在連接池之外,還提供了非常優秀的監控功能,這里講解如何與Spring Boot實現集成。

1.? 環境描述

???? Spring Boot 1.4.0.RELEASE,? JDK 1.8

2.?? Druid介紹

???? Druid是一個JDBC組件,它包括三部分:?

  • ?DruidDriver 代理Driver,能夠提供基于Filter-Chain模式的插件體系。
  • ?DruidDataSource 高效可管理的數據庫連接池。?
  • ?SQLParser?

?? Druid可以做什么???

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

???? 項目地址: https://github.com/alibaba/druid

3.?? Spring Boot與Druid的集成

?????? MySQL Driver驅動包:

?

[html]?view plain?copy
  • <dependency>??
  • ????????????<groupId>mysql</groupId>??
  • ????????????<artifactId>mysql-connector-java</artifactId>??
  • ????????????<scope>runtime</scope>??
  • ????????</dependency>??
  • ??? Spring Boot的JPA依賴包:

    [html]?view plain?copy
  • <dependency>??
  • ????????????<groupId>org.springframework.boot</groupId>??
  • ????????????<artifactId>spring-boot-starter-data-jpa</artifactId>??
  • ????????</dependency>??
  • ?? 阿里系的Druid依賴包:

    [html]?view plain?copy
  • <dependency>??
  • ????????????<groupId>com.alibaba</groupId>??
  • ????????????<artifactId>druid</artifactId>??
  • ????????????<version>1.0.25</version>??
  • ????????</dependency>??
  • ??? Spring Boot中的application.properties配置信息:

    ?

    ?

    [html]?view plain?copy
  • #?驅動配置信息??
  • spring.datasource.type=com.alibaba.druid.pool.DruidDataSource??
  • spring.datasource.url?=?jdbc:mysql://127.0.0.1:3306/mealsystem?useUnicode=true&characterEncoding=utf-8??
  • spring.datasource.username?=?root??
  • spring.datasource.password?=?123456??
  • spring.datasource.driverClassName?=?com.mysql.jdbc.Driver??
  • ???
  • #連接池的配置信息??
  • spring.datasource.initialSize=5??
  • spring.datasource.minIdle=5??
  • spring.datasource.maxActive=20??
  • 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.testOnReturn=false??
  • spring.datasource.poolPreparedStatements=true??
  • spring.datasource.maxPoolPreparedStatementPerConnectionSize=20??
  • spring.datasource.filters=stat,wall,log4j??
  • spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000??
  • ?在Spring Boot1.4.0中驅動配置信息沒有問題,但是連接池的配置信息不再支持這里的配置項,即無法通過配置項直接支持相應的連接池;這里列出的這些配置項可以通過定制化DataSource來實現。

    ?

    ? 目前Spring Boot中默認支持的連接池有dbcp,dbcp2, tomcat, hikari三種連接池。?

    由于Druid暫時不在Spring Bootz中的直接支持,故需要進行配置信息的定制:

    [html]?view plain?copy
  • @Configuration??
  • public?class?DruidDBConfig?{??
  • ????private?Logger?logger?=?LoggerFactory.getLogger(DruidDBConfig.class);??
  • ??????
  • ????@Value("${spring.datasource.url}")??
  • ????private?String?dbUrl;??
  • ??????
  • ????@Value("${spring.datasource.username}")??
  • ????private?String?username;??
  • ??????
  • ????@Value("${spring.datasource.password}")??
  • ????private?String?password;??
  • ??????
  • ????@Value("${spring.datasource.driverClassName}")??
  • ????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.maxPoolPreparedStatementPerConnectionSize}")??
  • ????private?int?maxPoolPreparedStatementPerConnectionSize;??
  • ??????
  • ????@Value("${spring.datasource.filters}")??
  • ????private?String?filters;??
  • ??????
  • ????@Value("{spring.datasource.connectionProperties}")??
  • ????private?String?connectionProperties;??
  • ??????
  • ????@Bean?????//聲明其為Bean實例??
  • ????@Primary??//在同樣的DataSource中,首先使用被標注的DataSource??
  • ????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);??
  • ????????try?{??
  • ????????????datasource.setFilters(filters);??
  • ????????}?catch?(SQLException?e)?{??
  • ????????????logger.error("druid?configuration?initialization?filter",?e);??
  • ????????}??
  • ????????datasource.setConnectionProperties(connectionProperties);??
  • ??????????
  • ????????return?datasource;??
  • ????}??
  • }??
  • ??? DruidDBConfig類被@Configuration標注,用作配置信息; DataSource對象被@Bean聲明,為Spring容器所管理, @Primary表示這里定義的DataSource將覆蓋其他來源的DataSource。
    ??

    ?

    #?下面為連接池的補充設置,應用到上面所有數據源中

    #?初始化大小,最小,最大

    spring.datasource.initialSize=5

    spring.datasource.minIdle=5

    spring.datasource.maxActive=20

    #?配置獲取連接等待超時的時間

    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.testOnReturn=false

    #?打開PSCache,并且指定每個連接上PSCache的大小

    spring.datasource.poolPreparedStatements=true

    spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

    #?配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻

    spring.datasource.filters=stat,wall,log4j

    #?通過connectProperties屬性來打開mergeSql功能;慢SQL記錄

    spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

    #?合并多個DruidDataSource的監控數據

    #spring.datasource.useGlobalDataSourceStat=true

    需要注意的是:spring.datasource.type舊的spring boot版本是不能識別的。

    ?配置StatView的Servlet:

    ?? Filter的實現類:

    [html]?view plain?copy
  • import?javax.servlet.annotation.WebFilter;??
  • import?javax.servlet.annotation.WebInitParam;??
  • ??
  • import?com.alibaba.druid.support.http.WebStatFilter;??
  • ??
  • @WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",??
  • ????initParams={??
  • ????????@WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略資源??
  • ???}??
  • )??
  • public?class?DruidStatFilter?extends?WebStatFilter?{??
  • ??
  • }??
  • ? StatViewServlet:

    [html]?view plain?copy
  • import?javax.servlet.annotation.WebInitParam;??
  • import?javax.servlet.annotation.WebServlet;??
  • ??
  • import?com.alibaba.druid.support.http.StatViewServlet;??
  • ??
  • @WebServlet(urlPatterns="/druid/*",??
  • ????initParams={??
  • ?????????@WebInitParam(name="allow",value="127.0.0.1,192.168.163.1"),//?IP白名單(沒有配置或者為空,則允許所有訪問)??
  • ?????????@WebInitParam(name="deny",value="192.168.1.73"),//?IP黑名單?(存在共同時,deny優先于allow)??
  • ?????????@WebInitParam(name="loginUsername",value="admin"),//?用戶名??
  • ?????????@WebInitParam(name="loginPassword",value="123456"),//?密碼??
  • ?????????@WebInitParam(name="resetEnable",value="false")//?禁用HTML頁面上的“Reset?All”功能??
  • })??
  • public?class?DruidStatViewServlet?extends?StatViewServlet?{??
  • ????private?static?final?long?serialVersionUID?=?-2688872071445249539L;??
  • ??
  • }??
  • 這兩個類相當于在web.xml中聲明了一個servlet, 等價于如下的配置信息(web.xml):

    ?

    ?

    [html]?view plain?copy
  • <servlet>????
  • ????????<servlet-name>DruidStatView</servlet-name>????
  • ????????<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>????
  • ????</servlet>????
  • ????<servlet-mapping>????
  • ????????<servlet-name>DruidStatView</servlet-name>????
  • ????????<url-pattern>/druid/*</url-pattern>????
  • ????</servlet-mapping>????
  • ?filter的配置信息:

    ?

    ?

    [html]?view plain?copy
  • <filter>????
  • ????????<filter-name>DruidWebStatFilter</filter-name>????
  • ????????<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>????
  • ????????<init-param>????
  • ????????????<param-name>exclusions</param-name>????
  • ????????????<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>????
  • ????????</init-param>????
  • ??????</filter>????
  • ??????<filter-mapping>????
  • ????????<filter-name>DruidWebStatFilter</filter-name>????
  • ????????<url-pattern>/*</url-pattern>????
  • ??????</filter-mapping>????
  • ?? 然后相應的配置工作就完成了,直接啟動即可看到相應的應用了。

    ?

    4.??? 運行界面以及介紹

    ??? 訪問地址: http://192.168.163.1:8080/druid/index.html

    ?????

    ???

    ????

    5.?? 參考資料

      • http://blog.csdn.net/xiaoyu411502/article/details/51392237
      • ?http://stackoverflow.com/questions/32833641/not-able-to-set-spring-datasource-type

    總結

    以上是生活随笔為你收集整理的Spring Boot下Druid连接池的使用配置分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。