1. 程式人生 > >Spring學習總結(21)——Spring整合阿里巴巴資料庫連線池DruidDataSource配置及其常見問題彙總

Spring學習總結(21)——Spring整合阿里巴巴資料庫連線池DruidDataSource配置及其常見問題彙總

一、參考配置如下

   <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-             method="init" destroy-method="close">

      <!-- 資料庫驅動 -->

      <property name="driverClassName" value="${jdbc.driverClassName}" />

      <!-- 基本屬性 url、user、password -->

      <property name="url" value="${jdbc_url}" />

      <property name="username" value="${jdbc_user}" />

      <property name="password" value="${jdbc_password}" />

      <!-- 配置初始化大小、最小、最大 -->

      <property name="initialSize" value="1" />

      <property name="minIdle" value="1" />

      <property name="maxActive" value="20" />

      <!-- 配置獲取連線等待超時的時間 -->

      <property name="maxWait" value="60000" />

      <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->

      <property name="timeBetweenEvictionRunsMillis" value="60000" />

      <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->

      <property name="minEvictableIdleTimeMillis" value="300000" />

      <property name="validationQuery" value="SELECT 'x'" />

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

      <property name="testOnBorrow" value="false" />

      <property name="testOnReturn" value="false" />

      <!-- 開啟PSCache,並且指定每個連線上PSCache的大小 -->

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

      <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

      <!-- 配置監控統計攔截的filters -->

      <property name="filters" value="stat" />

  </bean>

通常來說,只需要修改initialSize、minIdle、maxActive。如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。分庫分表較多的資料庫,建議配置為false。

二、druid常見問題彙總:

(1). Druid是什麼?

Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。

(2). 在哪裡下載druid

(3). 怎麼獲取Druid的原始碼

Druid是一個開源專案,原始碼託管在github上,原始碼倉庫地址是 https://github.com/alibaba/druid。同時每次Druid釋出正式版本和快照的時候,都會把原始碼打包,你可以從上面的下載地址中找到相關版本的原始碼

(4). 怎麼配置maven

Druid 0.1.18 之後版本都發布到maven中央倉庫中,所以你只需要在專案的pom.xml中加上dependency就可以了。例如:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid-version}</version>
    </dependency>

(5). 怎麼開啟Druid的監控統計功能

(6). 怎樣使用Druid的內建監控頁面

(7). 內建監控中的Web和Spring關聯監控怎麼配置?

(8). 怎麼配置防禦SQL注入攻擊

(9). Druid有沒有參考配置

(10). 我想日誌記錄JDBC執行的SQL,如何配置

(11). 我的程式可能產生連線洩漏了,有什麼辦法?

(12). 在Druid中使用PSCache會有記憶體佔用過大問題麼?

(13). 有沒有和其他資料庫連線池的對比?

(14). 從其他連線池遷移要注意什麼?

(15). Druid中有沒有類似Jboss DataSource中的ExceptionSorter

ExceptionSorter是JBoss DataSource中的優秀特性,Druid也有一樣功能的ExceptionSorter,但不用手動配置,自動識別生效的。具體看這裡:https://github.com/alibaba/druid/wiki/ExceptionSorter_cn

(16). Druid中的maxIdle為什麼是沒用的?

maxIdle是Druid為了方便DBCP使用者遷移而增加的,maxIdle是一個混亂的概念。連線池只應該有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分別相當於maxPoolSize和minPoolSize。

(17). 我的應用配置的是JNDI資料來源,可以用DruidDataSource麼?

(18). 我的應用已使用DBCP,是程式碼中寫死的,怎樣更換為Druid?

可以的,Druid提供了一箇中完全平滑遷移DBCP的辦法。

  • 2) 加入druid-xxx.jar 
  • 3) 從你的WEB-INF/lib/中刪除dbcp-xxx.jar 
  • 4) 按需要加上配置,比如JVM啟動引數加上-Ddruid.filters=stat,動態配置druid的filters 

這種用法,使得可以在一些非自己開發的應用中使用Druid,例如在sonar中部署druid,sonar是一個使用jruby開發的web應用,寫死了DBCP,只能夠通過這種方法來更換。

(19). 我想試用快照版本,怎麼獲取?

(20). 有一些SQL執行很慢,我希望日誌記錄下來,怎麼設定?

(21). 我希望加密我的資料庫密碼怎麼辦?

(22). 如何參與Druid的開發

(23). Druid的釋出週期是怎樣?

Druid是一個活躍的專案,長期維護。每個月有一個釋出視窗,除非遇到重大bug和非常緊急的需求,否則都是每個月最多釋出一次。如果沒有足夠多的需求,釋出視窗就不會被使用。

(24). 如果DruidDataSource在init的時候失敗了,不再使用,是否需要close

是的,如果DruidDataSource不再使用,必須呼叫close來釋放資源,釋放的資源包括關閉Create和Destory執行緒。

(25). DruidDataSource支援哪些資料庫?

理論上說,支援所有有jdbc驅動的資料庫。實際測試過的有

資料庫 支援狀態
mysql 支援,大規模使用
oracle 支援,大規模使用
sqlserver 支援
postgres 支援
db2 支援
h2 支援
derby 支援
sqlite 支援
sybase 支援

(26). Oracle下jdbc executeBatch時,更新行數計算不正確

使用jdbc的executeBatch 方法,如果資料庫為oracle,則無論是否成功更新到資料,返回值都是-2,而不是真正被sql更新到的記錄數,這是Oracle JDBC Driver的問題,Druid不作特殊處理。

(27). Druid如何自動根據URL自動識別DriverClass的

Druid是根據url字首來識別DriverClass的,這樣使得配置更方便簡潔。

字首 DriverCLass 描述資訊
jdbc:odps com.aliyun.odps.jdbc.OdpsDriver
jdbc:derby org.apache.derby.jdbc.EmbeddedDriver
jdbc:mysql com.mysql.jdbc.Driver
jdbc:oracle oracle.jdbc.driver.OracleDriver
jdbc:microsoft com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc:sybase:Tds com.sybase.jdbc2.jdbc.SybDriver
jdbc:jtds net.sourceforge.jtds.jdbc.Driver
jdbc:postgresql org.postgresql.Driver
jdbc:fake com.alibaba.druid.mock.MockDriver
jdbc:mock com.alibaba.druid.mock.MockDriver
jdbc:hsqldb org.hsqldb.jdbcDriver
jdbc:db2 COM.ibm.db2.jdbc.app.DB2Driver DB2的JDBC Driver十分混亂,這個匹配不一定對
jdbc:sqlite org.sqlite.JDBC
jdbc:ingres com.ingres.jdbc.IngresDriver
jdbc:h2 org.h2.Driver
jdbc:mckoi com.mckoi.JDBCDriver
jdbc:cloudscape COM.cloudscape.core.JDBCDriver
jdbc:informix-sqli com.informix.jdbc.IfxDriver
jdbc:timesten com.timesten.jdbc.TimesTenDriver
jdbc:as400 com.ibm.as400.access.AS400JDBCDriver
jdbc:sapdb com.sap.dbtech.jdbc.DriverSapDB
jdbc:JSQLConnect com.jnetdirect.jsql.JSQLDriver
jdbc:JTurbo com.newatlanta.jturbo.driver.Driver
jdbc:firebirdsql org.firebirdsql.jdbc.FBDriver
jdbc:interbase interbase.interclient.Driver
jdbc:pointbase com.pointbase.jdbc.jdbcUniversalDriver
jdbc:edbc ca.edbc.jdbc.EdbcDriver
jdbc:mimer:multi1 com.mimer.jdbc.Driver

(28). 如何儲存監控記錄

(29). 我想Log輸出SQL執行的資訊怎麼辦?

(30). 如何配置Druid內建的log實現

31. 如何在Spring Boot中整合Druid連線池和監控?