Java 數據庫連接池Druid 的介紹
前言:
Druid 連接池是阿裡巴巴開源的數據庫連接池項目,Druid 為監控而生,內置強大的監控功能,監控特性不影響性能,官網地址為:https://github.com/alibaba/druid/wiki/,本文主要介紹 Druid 的基本使用,文中使用到的軟件版本:Java 1.8.0_191、Druid 1.2.8、Spring Boot 2.3.12.RELEASE。
1、配置參數
Druid
連接池的配置參數兼容 DBCP
,個別配置的語意有所區別。
配置 | 缺省值 | 說明 |
---|---|---|
name | 配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。如果沒有配置,將會生成一個名字,格式是:”DataSource-” + System.identityHashCode(this)。配置此屬性版本至少為 1.0.5,低於該版本設置 name 會出錯。 | |
url | 連接數據庫的 url | |
username | 連接數據庫的用戶名 | |
password | 連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。 | |
driverClassName | 根據url自動識別 | 這一項可配可不配,如果不配置 Druid 會根據 url 自動識別 dbType,然後選擇相應的 driverClassName |
initialSize | 0 | 初始化時建立物理連接的個數。初始化發生在顯示調用 init 方法,或者第一次 getConnection 時 |
maxActive | 8 | 最大連接池數量 |
maxIdle | 8 | 已經不再使用,配置瞭也沒效果 |
minIdle | 最小連接池數量 | |
maxWait | 獲取連接時最大等待時間,單位毫秒。配置瞭 maxWait 之後,缺省啟用公平鎖,並發效率會有所下降,如果需要可以通過配置useUnfairLock 屬性為 true 使用非公平鎖。 | |
poolPreparedStatements | false | 是否緩存 preparedStatement,也就是 PSCache。PSCache 對支持遊標的數據庫性能提升巨大,比如說 oracle。在 mysql 下建議關閉。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要啟用 PSCache,必須配置大於 0,當大於 0 時,poolPreparedStatements 自動觸發修改為 true。在 Druid 中,不會存在 Oracle下 PSCache 占用內存過多的問題,可以把這個數值配置大一些,比如說 100 |
validationQuery | 用來檢測連接是否有效的 sql,要求是一個查詢語句,常用select ‘x’。如果 validationQuery 為 null,testOnBorrow、testOnReturn、testWhileIdle 都不會起作用。 | |
validationQueryTimeout | 單位:秒,檢測連接是否有效的超時時間。底層調用 jdbc Statement對象的 void setQueryTimeout(int seconds) 方法 | |
testOnBorrow | true | 申請連接時執行 validationQuery 檢測連接是否有效,做瞭這個配置會降低性能。 |
testOnReturn | false | 歸還連接時執行 validationQuery 檢測連接是否有效,做瞭這個配置會降低性能。 |
testWhileIdle | false | 建議配置為 true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於 timeBetweenEvictionRunsMillis,執行validationQuery 檢測連接是否有效。 |
keepAlive | false (1.0.28) |
連接池中的 minIdle 數量以內的連接,空閑時間超過 minEvictableIdleTimeMillis,則會執行 keepAlive 操作。 |
timeBetweenEvictionRunsMillis | 1分鐘(1.0.14) | 有兩個含義: 1) Destroy 線程會檢測連接的間隔時間,如果連接空閑時間大於等於 minEvictableIdleTimeMillis 則關閉物理連接。 2) testWhileIdle 的判斷依據,詳細看 testWhileIdle 屬性的說明 |
numTestsPerEvictionRun | 30分鐘(1.0.14) | 不再使用,一個 DruidDataSource 隻支持一個 EvictionRun |
minEvictableIdleTimeMillis | 連接保持空閑而不被驅逐的最小時間 | |
connectionInitSqls | 物理連接初始化的時候執行的 sql | |
exceptionSorter | 根據dbType自動識別 | 當數據庫拋出一些不可恢復的異常時,拋棄連接 |
filters | 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的 filter:stat 日志用的 filter:log4j 防禦 sql 註入的 filter:wall |
|
proxyFilters | 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置瞭 filters 和 proxyFilters,是組合關系,並非替換關系 |
2、使用
2.1、直接使用
2.1.1、引入依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
2.1.2、使用例子
package com.abc.demo.general.dbpool; import com.alibaba.druid.pool.DruidDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DruidCase { public static void main(String[] args) { DruidDataSource druidDataSource = new DruidDataSource(); Connection connection = null; try { druidDataSource.setName("測試連接池"); druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123456"); druidDataSource.setInitialSize(2); druidDataSource.setMinIdle(2); druidDataSource.setMaxActive(5); druidDataSource.setValidationQuery("select 1"); druidDataSource.setTestWhileIdle(true); druidDataSource.setTestOnBorrow(true); druidDataSource.setTestOnReturn(false); druidDataSource.setMaxWait(6000); druidDataSource.setFilters("slf4j"); connection = druidDataSource.getConnection(); Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("select version()"); if (rs.next()) { System.out.println(rs.getString(1)); } } catch (SQLException e) { e.printStackTrace(); } finally { close(connection); } //實際使用中一般是在應用啟動時初始化數據源,應用從數據源中獲取連接;並不會關閉數據源。 druidDataSource.close(); } private static void close(Connection connection) { if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
2.2、在 SpringBoot 中使用
2.1.1、引入依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
2.1.2、單數據源
application.yml 配置:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 2 min-idle: 2 max-active: 5 validation-query: select 1 test-while-idle: true test-on-borrow: true test-on-return: false max-wait: 6000 filter: slf4j
使用:
@Autowired private DataSource dataSource;
2.1.3、多數據源
application.yml 配置:
spring: datasource: druid: db1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://10.140.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 initial-size: 2 min-idle: 2 max-active: 5 validation-query: select 1 test-while-idle: true test-on-borrow: true test-on-return: false max-wait: 6000 filter: slf4j db2: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://10.40.9.12:3306/mydb?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 initial-size: 2 min-idle: 2 max-active: 5 validation-query: select 1 test-while-idle: true test-on-borrow: true test-on-return: false max-wait: 6000 filter: slf4j
數據源配置類:
package com.abc.demo.config; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration public class DataSourceConfig { @Primary @Bean("dataSource1") @ConfigurationProperties("spring.datasource.druid.db1") public DataSource dataSourceOne(){ return DruidDataSourceBuilder.create().build(); } @Bean("dataSource2") @ConfigurationProperties("spring.datasource.druid.db2") public DataSource dataSourceTwo(){ return DruidDataSourceBuilder.create().build(); } }
使用:
@Autowired @Qualifier("dataSource1") private DataSource dataSource1; @Autowired @Qualifier("dataSource2") private DataSource dataSource2;
2.1.4、開啟監控功能
Druid
內置瞭一些監控,Spring Boot
環境下通過少量配置就可開啟這些功能。
application.yml 配置:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8 username: root password: InsYR0ot187! type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 2 min-idle: 2 max-active: 5 validation-query: select 1 test-while-idle: true test-on-borrow: true test-on-return: false max-wait: 6000 filter: slf4j,stat,wall #啟用日志、監控統計、防火墻功能 web-stat-filter: #web監控配置 enabled: true stat-view-servlet: #監控頁面配置 enabled: true url-pattern: /druid/*
監控頁面:
Spring Boot
中集成 Druid 的詳細說明可以參考官網文檔:https://hub.fastgit.org/alibaba/druid/tree/master/druid-spring-boot-starter
到此這篇關於 Java 數據庫連接池Druid 的介紹的文章就介紹到這瞭,更多相關 Java連接池Druid 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Springboot2 集成 druid 加密數據庫密碼的配置方法
- springboot 整合druid及配置依賴
- SpringBoot集成Druid連接池連接MySQL8.0.11
- SpringBoot環境Druid數據源使用及特點
- SpringBoot配置 Druid 三種方式(包括純配置文件配置)