1. 程式人生 > >Spring配置數據庫連接池Druid

Spring配置數據庫連接池Druid

select code 強行 安全性 字符 ble 語法 filters spring配置

連接池原理

連接池基本的思想是在系統初始化的時候,將數據庫連接作為對象存儲在內存中,當用戶需要訪問數據庫時,並非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。使用完畢後,用戶也並非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次數、最大空閑時間等等,也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。

常用數據庫連接池及特點

  • dbcp:DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫連接池.DBCP可以直接的在應用程序中使用,Tomcat的數據源使用的就是DBCP。
  • c3p0:c3p0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規範說明的Connection 和Statement 池的DataSources 對象。
  • druid:阿裏出品,淘寶和支付寶專用數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。支持所有JDBC兼容的數據庫,包括 Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。

    Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存占用優化,MySql的ping檢測優化。

    Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。

    簡單SQL語句用時10微秒以內,復雜SQL用時30微秒。

    通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL註入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。

spring中配置druid連接池

由於druid的性能優於dbcp和c3p0,加上後兩個已經不怎麽更新了,所以這裏只介紹druid的配置方法。

首先需要在pom文件中加入相應依賴:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>版本</version>
</dependency>

在spring的applicationContext.xml中配置druid:

技術分享圖片
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <!-- 基本屬性 url、user、password -->
     <property name="driverClassName" value="${jdbc.driver}" />
     <property name="url" value="${jdbc_url}" />
     <property name="username" value="${jdbc_user}" />
     <property name="password" value="${jdbc_password}" />

     <!-- 配置監控統計攔截的filters -->
     <property name="filters" value="stat" />

     <!-- 配置初始化大小、最小、最大 -->
     <property name="maxActive" value="20" />
     <property name="initialSize" value="1" />
     <property name="minIdle" value="1" />

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

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

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

     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />

     <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
     <property name="poolPreparedStatements" value="true" />
     <property name="maxOpenPreparedStatements" value="20" />
 </bean>
技術分享圖片

DruidDataSource配置屬性列表

DruidDataSource配置兼容DBCP,但個別配置的語意有所區別。

配置缺省值說明
name 配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強行設置name會出錯。詳情-點此處。
url 連接數據庫的url,不同數據庫不一樣。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
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檢測連接是否有效。
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,如果同時配置了filters和proxyFilters,是組合關系,並非替換關系

Druid的監控統計功能

1.配置StatFilter

Druid內置提供一個StatFilter,用於統計監控信息。

配置詳情請參考官方文檔:

https://github.com/alibaba/druid/wiki/配置_StatFilter

2.配置StatViewServlet

Druid內置提供了一個StatViewServlet用於展示Druid的統計信息。

配置詳情請參考官方文檔:

https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置

更多內容請參照官方文檔:

https://github.com/alibaba/druid/wiki/首頁

Spring配置數據庫連接池Druid