數據庫連接池參數


主流數據庫連接池比較

常用的主流開源數據庫連接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等

C3p0: 開源的JDBC連接池,實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標准擴展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用於小型系統,代碼600KB左右。

DBCP (Database Connection Pool):由Apache開發的一個Java數據庫連接池項目, Jakarta commons-pool對象池機制,Tomcat使用的連接池組件就是DBCP。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar,預先將數據庫連接放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完再放回。單線程,並發量低,性能不好,適用於小型系統。

Tomcat Jdbc Pool:Tomcat在7.0以前都是使用common-dbcp做為連接池組件,但是dbcp是單線程,為保證線程安全會鎖整個連接池,性能較差,dbcp有超過60個類,也相對復雜。Tomcat從7.0開始引入了新增連接池模塊叫做Tomcat jdbc pool,基於Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通過異步方式獲取連接,支持高並發應用環境,超級簡單核心文件只有8個,支持JMX,支持XA Connection。

BoneCP:官方說法BoneCP是一個高效、免費、開源的Java數據庫連接池實現庫。設計初衷就是為了提高數據庫連接池性能,根據某些測試數據顯示,BoneCP的速度是最快的,要比當時第二快速的連接池快25倍左右,完美集成到一些持久化產品如Hibernate和DataNucleus中。BoneCP特色:高度可擴展,快速;連接狀態切換的回調機制;允許直接訪問連接;自動化重置能力;JMX支持;懶加載能力;支持XML和屬性文件配置方式;較好的Java代碼組織,100%單元測試分支代碼覆蓋率;代碼40KB左右。

Druid:Druid是Java語言中最好的數據庫連接池,Druid能夠提供強大的監控和擴展功能,是一個可用於大數據實時查詢和分析的高容錯、高性能的開源分布式系統,尤其是當發生代碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid仍能夠保持100%正常運行。主要特色:為分析監控設計;快速的交互式查詢;高可用;可擴展;Druid是一個開源項目,源碼托管在github上。

主流連接池各項功能對比如下:

 

 

1 Apache-DBCP: 
dataSource: 要連接的 datasource (通常我們不會定義在 server.xml) 
defaultAutoCommit: 對於事務是否 autoCommit, 默認值為 true 
defaultReadOnly: 對於數據庫是否只能讀取, 默認值為 false 
driverClassName:連接數據庫所用的 JDBC Driver Class, 
maxActive: 可以從對象池中取出的對象最大個數,為0則表示沒有限制,默認為8 
maxIdle: 最大等待連接中的數量,設 0 為沒有限制 (對象池中對象最大個數) 
minIdle:對象池中對象最小個數 
maxWait: 最大等待秒數, 單位為 ms, 超過時間會丟出錯誤信息 
password: 登陸數據庫所用的密碼 
url: 連接數據庫的 URL 
username: 登陸數據庫所用的帳號 
validationQuery: 驗證連接是否成功, SQL SELECT 指令至少要返回一行 
removeAbandoned: 是否自我中斷, 默認是 false 
removeAbandonedTimeout: 幾秒后會自我中斷, removeAbandoned 必須為 true 
logAbandoned: 是否記錄中斷事件, 默認為 false 
minEvictableIdleTimeMillis:大於0 ,進行連接空閑時間判斷,或為0,對空閑的連接不進行驗證;默認30分鍾 
timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小於等於0,不會啟動檢查線程,默認-1 
testOnBorrow:取得對象時是否進行驗證,檢查對象是否有效,默認為false 
testOnReturn:返回對象時是否進行驗證,檢查對象是否有效,默認為false 
testWhileIdle:空閑時是否進行驗證,檢查對象是否有效,默認為false 
initialSize:初始化線程數 

2 C3P0: 
acquireIncrement: 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 
acquireRetryAttempts: 定義在從數據庫獲取新連接失敗后重復嘗試的次數。Default: 30 
acquireRetryDelay: 兩次連接中間隔時間,單位毫秒。Default: 1000 
autoCommitOnClose: 連接關閉時默認將所有未提交的操作回滾。Defaul t: false  
automaticTestTable: c3p0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個參數那么屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供c3p0測試使用。Default: null 
breakAfterAcquireFailure: 獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。但是數據源仍有效保留,並在下次調用getConnection()的時候繼續嘗試獲取連接。如果設為true,那么在嘗試獲取連接失敗后該數據源將申明已斷開並永久關閉。Default: false 
checkoutTimeout:當連接池用完時客戶端調用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設為0則無限期等待。單位毫秒。Default: 0 
connectionTesterClassName: 通過實現ConnectionTester或QueryConnectionT ester的類來測試連接。類名需制定全路徑。Default: com.mchange.v2.c3p0.impl.Def aultConnectionTester 
factoryClassLocation: 指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那么無需設置,默認null即可Default: null 
idleConnectionTestPeriod: 每60秒檢查所有連接池中的空閑連接。Defaul t: 0 
initialPoolSize: 初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3 
maxIdleTime: 最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 
maxPoolSize: 連接池中保留的最大連接數。Default: 15 
maxStatements: JDBC的標准參數,用以控制數據源內加載的PreparedSt atements數量。但由於預緩存的statements屬於單個connection而不是整個連接池。所以設置這個參數需要考慮到多方面的因素。如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。Default: 0 
maxStatementsPerConnection: maxStatementsPerConnection定義了連接池內單個連接所擁有的最大緩存statements數。Default: 0 
numHelperThreads:c3p0是異步操作的,緩慢的JDBC操作通過幫助進程完成。擴展這些操作可以有效的提升性能通過多線程實現多個操作同時被執行。Default: 3 
overrideDefaultUser:當用戶調用getConnection()時使root用戶成為去獲取連接的用戶。主要用於連接池連接非c3p0的數據源時。Default: null 
overrideDefaultPassword:與overrideDefaultUser參數對應使用的一個參數。Default: null 
password:密碼。Default: null 
user:用戶名。Default: null 
preferredTestQuery:定義所有連接測試都執行的測試語句。在使用連接測試的情況下這個一顯著提高測試速度。注意:測試的表必須在初始數據源的時候就存在。Default: null 
propertyCycle:用戶修改系統配置參數執行前最多等待300秒。Defaul t: 300  
testConnectionOnCheckout:因性能消耗大請只在需要的時候使用它。如果設為true那么在每個connection提交的時候都將校驗其有效性。建議使用idleConnectio nTestPeriod或automaticTestTable等方法來提升連接測試的性能。Default: false  
testConnectionOnCheckin:如果設為true那么在取得連接的同時將校驗連接的有效性。Default: false

3 Proxool: 
acquireIncrement: 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 
fatal-sql-exception : 它是一個逗號分割的信息片段.當一個SQL異常發生時,他的異常信息將與這個信息片段進行比較.如果在片段中存在,那么這個異常將被認為是個致命錯誤(Fatal SQL Exception ).這種情況下,數據庫連接將要被放棄.無論發生什么,這個異常將會被重擲以提供給消費者.用戶最好自己配置一個不同的異常來拋出. 
fatal-sql-exception-wrapper-class : 正如上面所說,你最好配置一個不同的異常來重擲.利用這個屬性,用戶可以包裝SQLException,使他變成另外一個異常.這個異常或者繼承SQLException或者繼承字RuntimeException.proxool 自帶了2個實現:'org.logicalcobwebs.proxool .FatalSQLException' 和'org.logicalcobweb s.proxool .FatalRuntimeException' .后者更合適. 
house-keeping-sleep-time : house keeper 保留線程處於睡眠狀態的最長時間,house keeper 的職責就是檢查各個連接的狀態,並判斷是否需要銷毀或者創建. 
house-keeping-test-sql : 如果發現了空閑的數據庫連接.house keeper 將會用這個語句來測試.這個語句最好非常快的被執行.如果沒有定義,測試過程將會被忽略。 
injectable-connection-interface : 允許proxool 實現被代理的connection對象法. 
injectable-statement-interface : 允許proxool 實現被代理的Statement 對象方法. 
injectable-prepared-statement-interface : 允許proxool 實現被代理的PreparedS tatement 對象方法. 
injectable-callable-statement-interface : 允許proxool 實現被代理的CallableStat ement 對象方法. 
jmx : 如果屬性為true,就會注冊一個消息Bean到jms服務,消息Bean對象名: "Proxool:type=Pool, name=<alias>". 默認值為false. 
jmx-agent-id : 一個逗號分隔的JMX代理列表(如使用MbeanServerFactory .fi ndMBeanServer(String agentId)注冊的連接池。)這個屬性是僅當"jmx"屬性設置為"true"才有效。所有注冊jmx服務器使用這個屬性是不確定的 
jndi-name : 數據源的名稱 
maximum-active-time : 如果housekeeper 檢測到某個線程的活動時間大於這個數值.它將會殺掉這個線程.所以確認一下你的服務器的帶寬.然后定一個合適的值.默認是5分鍾. 
maximum-connection-count : 最大的數據庫連接數. 
maximum-connection-lifetime : 一個線程的最大壽命. 
minimum-connection-count : 最小的數據庫連接數 
overload-without-refusal-lifetime : 這可以幫助我們確定連接池的狀態。如果我們已經拒絕了一個連接在這個設定值(毫秒),然后被認為是超載。默認為60秒。 
prototype-count : 連接池中可用的連接數量.如果當前的連接池中的連接少於這個數值.新的連接將被建立(假設沒有超過最大可用數).例如.我們有3個活動連接2個可用連接,而我們的prototype-count是4,那么數據庫連接池將試圖建立另外2個連接.這和 minimum-connection-count不同. minimum-connect ion-count把活動的連接也計算在內.prototype-count 是spare connections 的數量. 
recently-started-threshold :這可以幫助我們確定連接池的狀態,連接數少還是多或超載。只要至少有一個連接已開始在此值(毫秒)內,或者有一些多余的可用連接,那么我們假設連接池是開啟的。默認為60秒 
simultaneous-build-throttle :這是我們可一次建立的最大連接數。那就是新增的連接請求,但還沒有可供使用的連接。由於連接可以使用多線程,在有限的時間之間建立聯系從而帶來可用連接,但是我們需要通過一些方式確認一些線程並不是立即響應連接請求的,默認是10。 
statistics :  連接池使用狀況統計。 參數“10s,1m,1d” 
statistics-log-level :日志統計跟蹤類型。 參數“ERROR”或 “INFO” 
test-before-use : 如果為true,在每個連接被測試前都會服務這個連接,如果一個連接失敗,那么將被丟棄,另一個連接將會被處理,如果所有連接都失敗,一個新的連接將會被建立。否則將會拋出一個SQLException異常。 
test-after-use : 如果為true,在每個連接被測試后都會服務這個連接,使其回到連接池中,如果連接失敗,那么將被廢棄。 
trace : 如果為true,那么每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL).你也可以注冊一個ConnectionListener (參看ProxoolFacade)得到這些信息

4 BoneCP: 
acquireIncrement: 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 
driveClass:數據庫驅動 
jdbcUrl:響應驅動的jdbcUrl 
username:數據庫的用戶名 
password:數據庫的密碼 
idleConnectionTestPeriod:檢查數據庫連接池中控線連接的間隔時間,單位是分,默認值:240,如果要取消則設置為0 
idleMaxAge:連接池中未使用的鏈接最大存活時間,單位是分,默認值:60,如果要永遠存活設置為0 
maxConnectionsPerPartition:每個分區最大的連接數 
minConnectionsPerPartition:每個分區最小的連接數 
partitionCount:分區數,默認值2,最小1,推薦3-4,視應用而定 
acquireIncrement:每次去拿數據庫連接的時候一次性要拿幾個,默認值:2 
statementsCacheSize:緩存prepared statements的大小,默認值:0 
releaseHelperThreads:每個分區釋放鏈接助理進程的數量,默認值:3,除非你的一個數據庫連接的時間內做了很多工作,不然過多的助理進程會影響你的性能 

 

Druid 連接池是阿里巴巴開源的數據庫連接池項目,Druid 為監控而生,內置強大的監控功能,監控特性不影響性能,官網地址為:https://github.com/alibaba/druid/wiki/Druid%E8%BF%9E%E6%8E%A5%E6%B1%A0%E4%BB%8B%E7%BB%8D;本文主要介紹 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

 

  • 配置參數

和其它連接池一樣DRUID的DataSource類為:com.alibaba.druid.pool.DruidDataSource,基本配置參數如下:

 

配置 缺省值 說明
name   配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。 
如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this)
jdbcUrl   連接數據庫的url,不同數據庫不一樣。例如: 
mysql : jdbc:mysql://10.20.153.104:3306/druid2 
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username   連接數據庫的用戶名
password   連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
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下建議關閉。
maxOpenPreparedStatements -1 要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100
validationQuery   用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。
testOnBorrow true 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnReturn false 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
testWhileIdle false 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
timeBetweenEvictionRunsMillis   有兩個含義: 
1) Destroy線程會檢測連接的間隔時間2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
numTestsPerEvictionRun   不再使用,一個DruidDataSource只支持一個EvictionRun
minEvictableIdleTimeMillis    
connectionInitSqls   物理連接初始化的時候執行的sql
exceptionSorter 根據dbType自動識別 當數據庫拋出一些不可恢復的異常時,拋棄連接
filters   屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 
監控統計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
proxyFilters  

類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關系,並非替換關系

 

  • 使用方法

DB數據源的使用方法也就是2種,一種是在代碼中寫死通過NEW操作符創建DataSSource,然后set一些連接屬性,這里不在累述;另外一種是基於SPRING的配置方法,然后讓SPRING的Context自動加載配置(以下配置文件默認都在項目根目錄下conf文件夾中)

1、屬性文件:application.properties(DataSource連接參數)

 

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/test 
jdbc.username=root 
jdbc.password=1qaz!QAZ

 

2、SPRING配置文件:spring-base.xml

 

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns=" http://www.springframework.org/schema/beans
 xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:batch=" http://www.springframework.org/schema/batch
 xsi:schemaLocation=" http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

 

 <bean id="propertyConfigure" 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
  <property name="locations"> 
   <list> 
    <value>./conf/application.properties</value> 
   </list> 
  </property> 
 </bean>

 

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
  init-method="init" destroy-method="close"> 
  <property name="driverClassName" value="${jdbc.driverClassName}" /> 
  <property name="url" value="${jdbc.url}" /> 
  <property name="username" value="${jdbc.username}" /> 
  <property name="password" value="${jdbc.password}" /> 
  <!-- 配置初始化大小、最小、最大 --> 
  <property name="initialSize" value="1" /> 
  <property name="minIdle" value="1" /> 
  <property name="maxActive" value="10" />

  <!-- 配置獲取連接等待超時的時間 --> 
  <property name="maxWait" value="10000" />

  <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> 
  <property name="timeBetweenEvictionRunsMillis" value="60000" />

  <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> 
  <property name="minEvictableIdleTimeMillis" value="300000" />

  <property name="testWhileIdle" value="true" />

  <!-- 這里建議配置為TRUE,防止取到的連接不可用 --> 
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />

  <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> 
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" 
   value="20" />

  <!-- 這里配置提交方式,默認就是TRUE,可以不用配置 -->

  <property name="defaultAutoCommit" value="true" />

  <!-- 驗證連接有效與否的SQL,不同的數據配置不同 --> 
  <property name="validationQuery" value="select 1 " /> 
  <property name="filters" value="stat" /> 
  <property name="proxyFilters"> 
   <list> 
    <ref bean="logFilter" /> 
   </list> 
  </property> 
 </bean>

 

 <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> 
  <property name="statementExecutableSqlLogEnable" value="false" /> 
 </bean>

</beans>

上面紅色標注部分為監控DB池連接執行監控,后面在做詳細說明.

 

  • 監控方式

1、WEB方式監控配置

<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> 
  <filter-name>druidWebStatFilter</filter-name> 
  <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 
  <init-param> 
   <param-name>exclusions</param-name> 
   <param-value>/public/*,*.js,*.css,/druid*,*.jsp,*.swf</param-value> 
  </init-param> 
  <init-param> 
   <param-name>principalSessionName</param-name> 
   <param-value>sessionInfo</param-value> 
  </init-param> 
  <init-param> 
   <param-name>profileEnable</param-name> 
   <param-value>true</param-value> 
  </init-param> 
 </filter> 
 <filter-mapping> 
  <filter-name>druidWebStatFilter</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping>

 

把上面servlet配置添加到項目web.xml即可。然后運行Tomcat,瀏覽器輸入 http://IP:PROT/druid

就可以打開Druid的監控頁面了.

2、日志文件監控

Druid提供了多種日志文件監控 commons-logging、log4j等,這里我們主要使用slf4j和logback來進行日志監控配置。

首先要引入slf4j和logback相關的jar文件(從Maven公共倉庫下載 http://search.maven.org/

<slf4j.version>1.7.7</slf4j.version> 
<logback.version>1.1.2</logback.version>

 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>${slf4j.version}</version> 
 </dependency> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-access</artifactId> 
    <version>${logback.version}</version> 
</dependency> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-core</artifactId> 
    <version>${logback.version}</version> 
</dependency> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version>${logback.version}</version> 
</dependency> 

 

接下配置logback的配置文件(./conf/logback.xml)

 

<configuration>

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
  <layout class="ch.qos.logback.classic.PatternLayout"> 
   <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 
   </Pattern> 
  </layout> 
 </appender>

 <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>./logs/druid_info.log</file> 
  <layout class="ch.qos.logback.classic.PatternLayout"> 
   <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern> 
  </layout> 
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
   <level>debug</level> 
  </filter> 
 </appender>

 <root level="DEBUG"> 
  <appender-ref ref="FILE" /> 
 </root> 
</configuration>

 

最后就是寫一個測試類進行測試

public class TestMain {

 public static void loadLoggerContext() { 
  System.getProperties().put("logback.configurationFile", "./conf/logback.xml"); 
  LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
  StatusPrinter.setPrintStream(System.err); 
  StatusPrinter.print(lc); 
 }

 public static void main(String[] args) { 
  try { 
   loadLoggerContext(); 
   FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("./conf/spring-base.xml"); 

  } catch (Exception e) { 
   System.out.println(e); 
  } 
 } 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM