Druid號稱是Java語言中最好的數據庫鏈接池。css
1) 能夠監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,可以詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。git
2) 替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫鏈接池。github
3) 數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是很差的行爲,容易致使安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。web
4) SQL執行日誌,Druid提供了不一樣的LogFilter,可以支持Common-Logging、Log4j和JdkLog,你能夠按須要選擇相應的LogFilter,監控你應用的數據庫訪問狀況。spring
5) 可以提供基於Filter-Chain模式的插件體系。sql
下面介紹下如何在項目中集成Druid:數據庫
一、maven依賴安全
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>${druid-version}</version>
- </dependency>
二、配置web.xmlruby
- <!-- druid -->
- <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>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>DruidWebStatFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
三、spring.xml中配置druid數據源oracle
- <!-- 數據源druid -->
- <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="${druid.pool.size.init}" />
- <property name="minIdle" value="${druid.pool.size.min}" />
- <property name="maxActive" value="${druid.pool.size.max}" />
- <!-- 配置監控統計攔截的filters,去掉後監控界面sql沒法統計 -->
- <property name="filters" value="stat" />
- </bean>
Druid常見問題:
一、怎麼打開Druid的監控統計功能
Druid的監控統計功能是經過filter-chain擴展實現,若是你要打開監控統計功能,配置StatFilter。
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
二、怎樣使用Druid的內置監控頁面
內置監控頁面是一個Servlet。
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
三、內置監控中的Web和Spring關聯監控怎麼配置?
Web關聯監控配置
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter
Spring關聯監控配置
四、怎麼配置防護SQL注入攻擊
Druid提供了WallFilter,它是基於SQL語義分析來實現防護SQL注入攻擊的。
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
五、Druid有沒有參考配置
不一樣的業務場景需求不一樣,你可使用咱們的參考配置,但建議你仔細閱讀相關文檔,瞭解清楚以後作定製配置。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
六、我想日誌記錄JDBC執行的SQL,如何配置
Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter。
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter
七、個人程序可能產生鏈接泄漏了,有什麼辦法?
Druid提供了多種監測鏈接泄漏的手段。
https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B
八、在Druid中使用PSCache會有內存佔用過大問題麼?
鏈接Oracle數據庫,打開PSCache,在其餘的數據庫鏈接池都會存在內存佔用過多的問題,Druid是惟一解決這個問題的鏈接池。
九、有沒有和其餘數據庫鏈接池的對比?
十、從其餘鏈接池遷移要注意什麼?
不一樣鏈接池的參數參照對比:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=6947005
DBCP遷移 https://github.com/alibaba/druid/wiki/DBCP%E8%BF%81%E7%A7%BB
十一、Druid中有沒有相似Jboss DataSource中的ExceptionSorter
ExceptionSorter是JBoss DataSource中的優秀特性,Druid也有同樣功能的ExceptionSorter,但不用手動配置,自動識別生效的。
具體看這裏:http://code.alibabatech.com/wiki/display/Druid/ExceptionSorter
十二、Druid中的maxIdle爲何是沒用的?
maxIdle是Druid爲了方便DBCP用戶遷移而增長的,maxIdle是一個混亂的概念。鏈接池只應該有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分別至關於maxPoolSize和minPoolSize。
1三、個人應用配置的是JNDI數據源,能夠用DruidDataSource麼?
DruidDataSource支持JNDI配置,具體看這裏:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_JNDI_Tomcat
具體實現的類是這個:com.alibaba.druid.pool.DruidDataSourceFactory,你能夠閱讀代碼加深理解。
1四、個人應用已使用DBCP,是代碼中寫死的,怎樣更換爲Druid?
能夠的,Druid提供了一箇中徹底平滑遷移DBCP的辦法。
1) 從http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下載druid-wrapper-xxx.jar
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,只可以經過這種方法來更換。
1五、有一些SQL執行很慢,我但願日誌記錄下來,怎麼設置?
在StatFilter配置中有慢SQL執行日誌記錄。
看這裏 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
1六、我但願加密個人數據庫密碼怎麼辦?
運維和DBA都不但願把密碼明文直接寫在配置文件中,Druid提供了數據庫祕密加密的功能。
具體看這裏:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
1七、若是DruidDataSource在init的時候失敗了,再也不使用,是否須要close
是的,若是DruidDataSource再也不使用,必須調用close來釋放資源,釋放的資源包括關閉Create和Destory線程。
1八、DruidDataSource支持哪些數據庫?
理論上說,支持全部有jdbc驅動的數據庫。
1九、Oracle下jdbc executeBatch時,更新行數計算不正確
使用jdbc的executeBatch 方法,若是數據庫爲oracle,則不管是否成功更新到數據,返回值都是-2,而不是真正被sql更新到的記錄數,這是Oracle JDBC Driver的問題,Druid不做特殊處理。
20、Druid如何自動根據URL自動識別DriverClass的
Druid是根據url前綴來識別DriverClass的,這樣使得配置更方便簡潔。
2一、如何保存監控記錄
2二、我想Log輸出SQL執行的信息怎麼辦?
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter
2三、如何配置Druid內置的log實現