阿里的druid


Druid首先是一個數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。

Druid支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。 

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

優點:

首先,強大的監控特性,通過Druid提供的監控功能,可以清楚知道連接池和SQL的工作情況。 

  • 監控SQL的執行時間、ResultSet持有時間、返回行數、更新行數、錯誤次數、錯誤堆棧信息。
  • SQL執行的耗時區間分布。什么是耗時區間分布呢?比如說,某個SQL執行了1000次,其中0~1毫秒區間50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通過耗時區間分布,能夠非常清楚知道SQL的執行耗時情況。
  • 監控連接池的物理連接創建和銷毀次數、邏輯連接的申請和關閉次數、非空等待次數、PSCache命中率等。

 

其次,方便擴展。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日志等等。 

Druid內置提供了用於監控的StatFilter、日志輸出的Log系列Filter、防御SQL注入攻擊的WallFilter。 

阿里巴巴內部實現了用於數據庫密碼加密的CirceFilter,以及和Web、Spring關聯監控的DragoonStatFilter。 

第三,Druid集合了開源和商業數據庫連接池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。 

    • ExceptionSorter。當一個連接產生不可恢復的異常時,例如Oracle error_code_28 session has been killed,必須立刻從連接池中逐出,否則會產生大量錯誤。目前只有Druid和JBoss DataSource實現了ExceptionSorter。
    • PSCache內存占用優化對於支持游標的數據庫(Oracle、SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL執行性能。一個PreparedStatement對應服務器一個游標,如果PreparedStatement被緩存起來重復執行,PreparedStatement沒有被關閉,服務器端的游標就不會被關閉,性能提高非常顯著。在類似“SELECT * FROM T WHERE ID = ?”這樣的場景,性能可能是一個數量級的提升。但在Oracle JDBC Driver中,其他的數據庫連接池(DBCP、JBossDataSource)會占用內存過多,極端情況可能大於1G。Druid調用OracleDriver提供管理PSCache內部API。
    • LRU是一個性能關鍵指標,特別Oracle,每個Connection對應數據庫端的一個進程,如果數據庫連接池遵從LRU,有助於數據庫服務器優化,這是重要的指標。Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0則不是。BoneCP在mock環境下性能可能還好,但在真實環境中則就不好了

 

1、maven配置

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.23</version>
</dependency>

二、web.xml配置

<servlet>
    <servlet-name>DruidStatView</servlet-name>
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    <init-param>  
    <!-- 允許清空統計數據 -->  
    <param-name>resetEnable</param-name>  
    <param-value>true</param-value>  
    </init-param>  
    <init-param>  
    <!-- 用戶名 -->  
    <param-name>loginUsername</param-name>  
    <param-value>yitop</param-value>  
    </init-param>  
    <init-param>  
    <!-- 密碼 -->  
    <param-name>loginPassword</param-name>  
    <param-value>123456</param-value>  
    </init-param> 
   </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,*.woff,*.cache.html,*.eot,/druid/*,hosted.html,index.html</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>DruidWebStatFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

三、spring配置

<bean id="slf4j-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
        <property name="statementExecutableSqlLogEnable" value="true"/>
    </bean>

    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
        <property name="slowSqlMillis" value="3000"/>
        <property name="logSlowSql" value="true"/>
    </bean>

    <!-- 數據源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本屬性 url、user、password -->
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />
        <property name="maxActive" value="20" />
        <!-- 配置獲取連接等待超時的時間 -->
        <property name="maxWait" value="10000" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="SELECT 'x' FROM DUAL" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <!-- 打開PSCache,並且指定每個連接上PSCache的大小 如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。 -->
        <property name="poolPreparedStatements" value="true" />
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
        <!-- 配置監控統計攔截的filters -->
        <property name="proxyFilters">
            <list>
                <ref bean="stat-filter"/>
                <ref bean="slf4j-filter"/>
            </list>
        </property>
    </bean>

4、配置成功發布項目后,可進入"項目url/druid/login.html"來體檢druid強大的監控功能

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM