數(shù)據(jù)庫連接池Druid的介紹顾彰,配置分析對(duì)比總結(jié)

Druid的簡介

Druid首先是一個(gè)數(shù)據(jù)庫連接池极阅。Druid是目前最好的數(shù)據(jù)庫連接池,在功能涨享、性能筋搏、擴(kuò)展性方面,都超過其他數(shù)據(jù)庫連接池灰伟,包括DBCP拆又、C3P0、BoneCP栏账、Proxool帖族、JBoss DataSource。Druid已經(jīng)在阿里巴巴部署了超過600個(gè)應(yīng)用挡爵,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗(yàn)竖般。Druid是阿里巴巴開發(fā)的號(hào)稱為監(jiān)控而生的數(shù)據(jù)庫連接池!

Druid的功能

1茶鹃、替換DBCP和C3P0涣雕。Druid提供了一個(gè)高效、功能強(qiáng)大闭翩、可擴(kuò)展性好的數(shù)據(jù)庫連接池挣郭。

2、可以監(jiān)控?cái)?shù)據(jù)庫訪問性能疗韵,Druid內(nèi)置提供了一個(gè)功能強(qiáng)大的StatFilter插件兑障,能夠詳細(xì)統(tǒng)計(jì)SQL的執(zhí)行性能,這對(duì)于線上分析數(shù)據(jù)庫訪問性能有幫助。

3流译、數(shù)據(jù)庫密碼加密逞怨。直接把數(shù)據(jù)庫密碼寫在配置文件中,這是不好的行為福澡,容易導(dǎo)致安全問題叠赦。DruidDruiver和DruidDataSource都支持PasswordCallback。

4革砸、SQL執(zhí)行日志除秀,Druid提供了不同的LogFilter,能夠支持Common-Logging业岁、Log4j和JdkLog鳞仙,你可以按需要選擇相應(yīng)的LogFilter,監(jiān)控你應(yīng)用的數(shù)據(jù)庫訪問情況笔时。

5棍好、擴(kuò)展JDBC,如果你要對(duì)JDBC層有編程的需求允耿,可以通過Druid提供的Filter機(jī)制借笙,很方便編寫JDBC層的擴(kuò)展插件。

所以Druid可以:
1较锡、充當(dāng)數(shù)據(jù)庫連接池业稼。
2、可以監(jiān)控?cái)?shù)據(jù)庫訪問性能
3蚂蕴、獲得SQL執(zhí)行日志

工程配置如下:

1低散、工程引入druid-1.0.15.jar

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

2、數(shù)據(jù)源配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
    <property value="${jdbc_url}" name="url"></property>  
    <property value="${jdbc_user}" name="username"></property>  
    <property value="${jdbc_password}" name="password"></property>  
   
    <property value="stat" name="filters"></property>  
   
    <property value="20" name="maxActive"></property>  
    <property value="1" name="initialSize"></property>  
    <property value="60000" name="maxWait"></property>  
    <property value="1" name="minIdle"></property>  
   
    <property value="60000" name="timeBetweenEvictionRunsMillis"></property>  
    <property value="300000" name="minEvictableIdleTimeMillis"></property>  
   
    <property value="SELECT 'x'" name="validationQuery"></property>  
    <property value="true" name="testWhileIdle"></property>  
    <property value="false" name="testOnBorrow"></property>  
    <property value="false" name="testOnReturn"></property>  
    <property value="true" name="poolPreparedStatements"></property>  
    <property value="20" name="maxPoolPreparedStatementPerConnectionSize"></property>  
</bean> 

3骡楼、Web.xml配置

    <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>

至此基本配置完成熔号,可以查看內(nèi)置監(jiān)控頁面了,路徑是/druid/index.html鸟整,
完整路徑是http://127.0.0.1:8080/druid/index.html
如果還需要使用Web應(yīng)用引镊、URI監(jiān)控、Session監(jiān)控篮条、Spring監(jiān)控等則還需要繼續(xù)增加配置弟头。

4、Wen應(yīng)用配置
WebStatFilter用于采集web-jdbc關(guān)聯(lián)監(jiān)控的數(shù)據(jù)

在Web.xml中增加配置涉茧,就可以使用Web應(yīng)用赴恨、URI監(jiān)控、Session監(jiān)控等功能

<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>
    <init-param>
        <param-name>profileEnable</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>principalCookieName</param-name>
        <param-value>USER_COOKIE</param-value>
    </init-param>
    <init-param>
        <param-name>principalSessionName</param-name>
        <param-value>USER_SESSION</param-value>
    </init-param>
</filter>

<filter-mapping>
 <filter-name>DruidWebStatFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

5伴栓、Spring監(jiān)控配置
在Spring配置文件中增加

<bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
    </bean>
<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">
   <property name="patterns">
       <list>
           <value>com.company.bussines.service.*</value>
           <value>com.company.bussines.dao.*</value>
       </list>
   </property>
</bean>

<aop:config proxy-target-class="true">
   <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" />
</aop:config>

所有配置完成嘱支。


1. Druid是什么蚓胸?

Druid是Java語言中最好的數(shù)據(jù)庫連接池挣饥。Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能除师。

2. 在哪里下載druid

3. 怎么獲取Druid的源碼

Druid是一個(gè)開源項(xiàng)目,源碼托管在github上扔枫,源代碼倉庫地址是 https://github.com/alibaba/druid汛聚。同時(shí)每次Druid發(fā)布正式版本和快照的時(shí)候,都會(huì)把源碼打包短荐,你可以從上面的下載地址中找到相關(guān)版本的源碼

4. 怎么配置maven

Druid 0.1.18 之后版本都發(fā)布到maven中央倉庫中倚舀,所以你只需要在項(xiàng)目的pom.xml中加上dependency就可以了。例如:

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

也可以選擇 Maven倉庫查找公共的倉庫地址:http://www.mvnrepository.com/artifact/com.alibaba/druid

5. 怎么打開Druid的監(jiān)控統(tǒng)計(jì)功能

Druid的監(jiān)控統(tǒng)計(jì)功能是通過filter-chain擴(kuò)展實(shí)現(xiàn)忍宋,如果你要打開監(jiān)控統(tǒng)計(jì)功能痕貌,配置StatFilter,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

6. 怎樣使用Druid的內(nèi)置監(jiān)控頁面

內(nèi)置監(jiān)控頁面是一個(gè)Servlet糠排,具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE

7. 內(nèi)置監(jiān)控中的Web和Spring關(guān)聯(lián)監(jiān)控怎么配置舵稠?

8. 怎么配置防御SQL注入攻擊

Druid提供了WallFilter,它是基于SQL語義分析來實(shí)現(xiàn)防御SQL注入攻擊的入宦。具體配置看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

9. Druid有沒有參考配置

不同的業(yè)務(wù)場景需求不同哺徊,你可以使用我們的參考配置,但建議你仔細(xì)閱讀相關(guān)文檔乾闰,了解清楚之后做定制配置落追。https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_DruidDataSource%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AE

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

Druid提供了Log4jFilter涯肩、CommonsLogFilter和Slf4jFilter轿钠,具體配置看這里https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

11. 我的程序可能產(chǎn)生連接泄漏了,有什么辦法病苗?

Druid提供了多種監(jiān)測(cè)連接泄漏的手段疗垛,具體看這里:https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B

12. 在Druid中使用PSCache會(huì)有內(nèi)存占用過大問題么?

連接Oracle數(shù)據(jù)庫铅乡,打開PSCache继谚,在其他的數(shù)據(jù)庫連接池都會(huì)存在內(nèi)存占用過多的問題,Druid是唯一解決這個(gè)問題的連接池阵幸。具體看這里:https://github.com/alibaba/druid/wiki/Oracle%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%8BPreparedStatementCache%E5%86%85%E5%AD%98%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88

13. 有沒有和其他數(shù)據(jù)庫連接池的對(duì)比花履?

14. 從其他連接池遷移要注意什么?

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

ExceptionSorter是JBoss DataSource中的優(yōu)秀特性挚赊,Druid也有一樣功能的ExceptionSorter诡壁,但不用手動(dòng)配置,自動(dòng)識(shí)別生效的荠割。具體看這里:https://github.com/alibaba/druid/wiki/ExceptionSorter_cn

16. Druid中的maxIdle為什么是沒用的妹卿?

maxIdle是Druid為了方便DBCP用戶遷移而增加的旺矾,maxIdle是一個(gè)混亂的概念。連接池只應(yīng)該有maxPoolSize和minPoolSize夺克,druid只保留了maxActive和minIdle箕宙,分別相當(dāng)于maxPoolSize和minPoolSize。

17. 我的應(yīng)用配置的是JNDI數(shù)據(jù)源铺纽,可以用DruidDataSource么柬帕?

DruidDataSource支持JNDI配置,具體看這里:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_JNDI_Tomcat
具體實(shí)現(xiàn)的類是這個(gè):com.alibaba.druid.pool.DruidDataSourceFactory狡门,你可以閱讀代碼加深理解陷寝。

18. 我的應(yīng)用已使用DBCP,是代碼中寫死的其馏,怎樣更換為Druid凤跑?

可以的,Druid提供了一個(gè)中完全平滑遷移DBCP的辦法叛复。

這種用法致扯,使得可以在一些非自己開發(fā)的應(yīng)用中使用Druid肤寝,例如在sonar中部署druid,sonar是一個(gè)使用jruby開發(fā)的web應(yīng)用抖僵,寫死了DBCP鲤看,只能夠通過這種方法來更換。

19. 我想試用快照版本耍群,怎么獲纫骞稹?

直接獲取快照版本的地址是:http://code.alibabatech.com/mvn/snapshots/com/alibaba/druid/ 蹈垢,使用快照版本建議加入我們QQ群 92748305慷吊,遇到問題直接反饋給我們。

20. 有一些SQL執(zhí)行很慢曹抬,我希望日志記錄下來溉瓶,怎么設(shè)置?

在StatFilter配置中有慢SQL執(zhí)行日志記錄谤民,看這里https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

21. 我希望加密我的數(shù)據(jù)庫密碼怎么辦堰酿?

運(yùn)維和DBA都不希望把密碼明文直接寫在配置文件中,Druid提供了數(shù)據(jù)庫秘密加密的功能张足。具體看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

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

Druid是一個(gè)通過github開源的項(xiàng)目触创,github的特性,使得你很容易參與其中为牍。這里有詳細(xì)說明https://github.com/alibaba/druid/wiki/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E

23. Druid的發(fā)布周期是怎樣哼绑?

Druid是一個(gè)活躍的項(xiàng)目岩馍,長期維護(hù)。每個(gè)月有一個(gè)發(fā)布窗口抖韩,除非遇到重大bug和非常緊急的需求蛀恩,否則都是每個(gè)月最多發(fā)布一次。如果沒有足夠多的需求帽蝶,發(fā)布窗口就不會(huì)被使用赦肋。

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

是的,如果DruidDataSource不再使用囱井,必須調(diào)用close來釋放資源驹尼,釋放的資源包括關(guān)閉Create和Destory線程。

25. DruidDataSource支持哪些數(shù)據(jù)庫庞呕?

理論上說新翎,支持所有有jdbc驅(qū)動(dòng)的數(shù)據(jù)庫。實(shí)際測(cè)試過的有

| 數(shù)據(jù)庫 | 支持狀態(tài) |
| mysql | 支持住练,大規(guī)模使用 |
| oracle | 支持地啰,大規(guī)模使用 |
| sqlserver | 支持 |
| postgres | 支持 |
| db2 | 支持 |
| h2 | 支持 |
| derby | 支持 |
| sqlite | 支持 |
| sybase | 支持 |

26. Oracle下jdbc executeBatch時(shí),更新行數(shù)計(jì)算不正確

使用jdbc的executeBatch 方法讲逛,如果數(shù)據(jù)庫為oracle亏吝,則無論是否成功更新到數(shù)據(jù),返回值都是-2盏混,而不是真正被sql更新到的記錄數(shù)蔚鸥,這是Oracle JDBC Driver的問題,Druid不作特殊處理许赃。

27. Druid如何自動(dòng)根據(jù)URL自動(dòng)識(shí)別DriverClass的

Druid是根據(jù)url前綴來識(shí)別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十分混亂混聊,這個(gè)匹配不一定對(duì) |
| 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. 如何保存監(jiān)控記錄

https://github.com/alibaba/druid/wiki/%E6%80%8E%E4%B9%88%E4%BF%9D%E5%AD%98Druid%E7%9A%84%E7%9B%91%E6%8E%A7%E8%AE%B0%E5%BD%95

29. 我想Log輸出SQL執(zhí)行的信息怎么辦弹谁?

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

30. 如何配置Druid內(nèi)置的log實(shí)現(xiàn)

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AEdruid%E5%86%85%E7%BD%AE%E7%9A%84log%E5%AE%9E%E7%8E%B0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市句喜,隨后出現(xiàn)的幾起案子预愤,更是在濱河造成了極大的恐慌,老刑警劉巖藤滥,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳖粟,死亡現(xiàn)場離奇詭異,居然都是意外死亡拙绊,警方通過查閱死者的電腦和手機(jī)向图,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門泳秀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榄攀,你說我怎么就攤上這事嗜傅。” “怎么了檩赢?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵吕嘀,是天一觀的道長。 經(jīng)常有香客問我贞瞒,道長偶房,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任军浆,我火速辦了婚禮棕洋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乒融。我一直安慰自己掰盘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布赞季。 她就那樣靜靜地躺著愧捕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪申钩。 梳的紋絲不亂的頭發(fā)上次绘,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音典蜕,去河邊找鬼断盛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛愉舔,可吹牛的內(nèi)容都是我干的钢猛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼轩缤,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼命迈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起火的,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤壶愤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馏鹤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體征椒,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年湃累,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勃救。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍讨。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒙秒,靈堂內(nèi)的尸體忽然破棺而出勃黍,到底是詐尸還是另有隱情,我是刑警寧澤晕讲,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布覆获,位于F島的核電站,受9級(jí)特大地震影響瓢省,放射性物質(zhì)發(fā)生泄漏弄息。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一净捅、第九天 我趴在偏房一處隱蔽的房頂上張望疑枯。 院中可真熱鬧,春花似錦蛔六、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豆村,卻和暖如春液兽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掌动。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工四啰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粗恢。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓柑晒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眷射。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匙赞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359