阿里資料庫連線池Druid
Druid是什麼?
Druid首先是一個數據庫連線池。Druid是目前最好的資料庫連線池,在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。
Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。
同時Druid不僅僅是一個數據庫連線池,它包括四個部分:
Druid是一個JDBC元件,它包括三個部分:
基於Filter-Chain模式的外掛體系。DruidDataSource 高效可管理的資料庫連線池。SQLParser
Druid可以做什麼?
替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴充套件性好的資料庫連線池。可以監控資料庫訪問效能,Druid內建提供了一個功能強大的StatFilter外掛,能夠詳細統計SQL的執行效能,這對於線上分析資料庫訪問效能有幫助。資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支援PasswordCallback。SQL執行日誌,Druid提供了不同的LogFilter,能夠支援Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。擴充套件JDBC,如果你要對JDBC層有程式設計的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴充套件外掛。
在專案中使用Druid非常簡單,只要修改下配置檔案就可以了
下載 druid-0.2.20.jar http://download.csdn.net/detail/wind520/5670085
applicationContext.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:aop="
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<description>Spring公共配置檔案 </description>
<!-- 定義受環境影響易變的變數 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<!-- 標準配置 -->
<value>classpath*:/application.properties</value>
</list>
</property>
</bean>
<!-- 資料來源配置,使用應用內的c3p0資料庫連線池 -->
<!--
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialPoolSize" value="5"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="100"/>
<property name="checkoutTimeout" value="5000"/>
<property name="maxIdleTime" value="1800"/>
<property name="idleConnectionTestPeriod" value="3000"/>
<property name="acquireIncrement" value="3"/>
</bean>
-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="filters" value="stat" />
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="minIdle" value="1" />
<property name="timeBetweenEvictionRunsMillis" value="3000" />
<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" />
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
</bean>
<!-- Hibernate配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.kingmed.jusmartcare.health.entity</value>
</list>
</property>
</bean>
<!-- 事務管理器配置,單資料來源事務 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 使用annotation定義事務 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
</beans>
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>
就可以看監控頁面
Druid監控SSM專案效能-配置與例項
介紹
以前弄專案的時候,也沒配置druid效能監控,但是隨著使用者的增多,有的時候網站訪問慢了,就想知道哪個地方遇到了效能問題,然後好對方法以及sql進行優化,該加索引的加索引,該快取的去快取。
Druid是阿里巴巴開源平臺上一個資料庫連線池實現(網上都說這個是目前java最好的連線池)。Druid還能夠提供強大的監控和擴充套件功能。
Druid是一個開源專案,原始碼託管在github上,原始碼倉庫地址是 :
https://github.com/alibaba/druid
能做到精度在方法級的監控,方便你找出在哪個方法上,哪個sql語句上花費的時間最多,然後做出針對性優化
maven配置druid
1 2 3 4 5 6 |
|
在Maven倉庫的地址,自己配置另外的版本:
http://www.mvnrepository.com/artifact/com.alibaba/druid
開啟Druid的監控統計功能
在spring的配置檔案中,資料來源的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
p:filters 配置值為:stat,wall,log4j
監控統計用的filter:stat
日誌用的filter:log4j
防禦sql注入的filter:wall
你可以自己選擇配置,多個配置之間用英文逗號隔開
web.xml增加配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
可以配置使用者名稱和密碼,也可以配置白名單。如果不配置使用者名稱密碼,就是任何人都可以訪問了。
如何訪問
訪問地址:
http://127.0.0.1:8080/專案名稱/druid/index.html
輸入賬號密碼登入之後
訪問 http://localhost:8080/insert?name=chx
插入資料
可以看到sql語句執行的效能
SQL執行時間分佈
比如說,某個SQL執行了1000次,其中0~1毫秒區間50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通過耗時區間分佈,能夠非常清楚知道SQL的執行耗時情況
現在還只能看資料來源和SQL監控,SQL防火牆,Web應用,URL監控,Session監控,Spring監控未開啟
開啟URL監控,Session監控,Web應用
web.xml中配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
開啟Spring監控
既然是Spring專案,肯定要監控一下Spring的Bean啦
結合spring的AOP特性對程式碼的執行效果進行監控,druid可以做到方法級別的監控,這個功能可以讓你發現方法的呼叫頻率及方法的執行時間,及時做出調整和修正使得專案更健壯。
spring配置檔案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
配置SQL慢查詢的日誌
在SQL監控中,有一項關於sql執行最慢執行時間的統計,但是隻有一個值,就是一條sql語句最慢的執行時間記錄。我們可以對執行在時間超過某個時間的sql語句進行日誌輸出,方便進行效能優化
spring配置檔案增加攔截器
修改資料來源配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
配置慢sql時間及日誌攔截器
1 2 3 4 5 6 7 8 9 10 11 |
|
在這裡,因為我是在本地進行,資料量又小,我將時間設定為了5ms,以方便測試
修改log4j配置檔案,增加慢sql日誌的輸出策略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
由於設定了慢sql的時間為大於5毫秒,所以執行時間大於5毫秒的都會被紅色標註。
再看日誌檔案:
已經將查詢慢的sql列印了出來
如果你在使用過程中遇到其他無法解決的druid問題,或者想配置另外的東西,可以訪問下面的地址,官方的文件都在這裡
https://github.com/alibaba/druid/wiki/常見問題