Druid Monitor監控Java Web和Java SE項目

Druid Monitor

  對於數據源,你們已經接觸了很多了。好比c3p0、dhcp、proxool等,以後又發現使用tomcat-jdbc能夠大大的提升性能。可是針對於咱們的高併發的系統來講,總但願能找到一個性能更好、更穩定的產品來代替。在開源中國上偶然發現了不少公司都在使用Druid這個數據源,而後搜索了一些相關資料,有人提供了這幾個數據源的性能測試報告,忽然發現這個數據源以很好的性能已經被你們廣泛使用了。因而就想深刻的研究一下這個數據源了。其實不少項目都是JavaSE的,可是官網針對於JavaSE的項目又沒有具體說明應該怎麼使用其監控統計功能。因而本身就看了一下源碼發現了有配置jmxUrl的地方,能夠想一想這個應該就是針對於遠程監控項目的配置了。在這裏我就整理一下本身的使用狀況供之後的人員參考,若是有錯誤的地方,也請大牛指證,我也多學習學習。css

首先說明一下你們都知道的幾個地址吧,也省的訪客來回搜索了。html

正式版本下載地址:http://repo1.maven.org/maven2/com/alibaba/druid/
Druid是一個開源項目,源碼託管在github上:https://github.com/alibaba/druid
Druid 0.1.18以後版本都發布到maven中央倉庫中,因此你只須要在項目的pom.xml中加上dependency就能夠了。例如:java

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

也能夠選擇 Maven倉庫查找公共的倉庫地址:http://www.mvnrepository.com/artifact/com.alibaba/druidmysql

接下來講明一下怎麼查看DruidDataSource的監控數據。
對於web項目,使用起來很方便,只須要在web.xml中配置一下DruidStatView就好了。其它的Druid已經幫咱們都實現了。linux

1.Druid Monitor監控Java Web項目git

先說明一下數據源的配置狀況吧,例:github

<?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:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/aop   
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
           http://www.springframework.org/schema/tx  
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
      
      
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"  
        destroy-method="close"> 
        <!-- 基本屬性 url、user、password -->  
        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />  
        <property name="url" value="jdbc:oracle:thin:@192.168.102.93:1521:mydb1" />  
        <property name="username" value="my_v31" />  
        <property name="password" value="my_v31" />  
      
        <!-- 配置初始化大小、最小、最大 -->  
        <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" />  
          
        <!--   
            用來檢測鏈接是否有效的sql,要求是一個查詢語句。  
            若是validationQuery爲null,testOnBorrow、testOnReturn、  
            testWhileIdle都不會其做用   
        -->  
        <property name="validationQuery" value="SELECT 1 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,去掉後監控界面sql沒法統計 -->  
        <property name="filters" value="stat,wall,log4j" />  
          
        <!--   
            若是配置了proxyFilters,此配置能夠不配置  
            druid.stat.mergeSql=true 合併執行的相同sql,避免由於參數不一樣而統計多條sql語句  
            druid.stat.slowSqlMillis=10000 用來配置SQL慢的標準,執行時間超過slowSqlMillis的就是慢  
              
        <property name="connectionProperties" value="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=10000" />  
         -->  
           
        <!-- 監控統計攔截的filters -->  
        <!-- 並在filters屬性中配置了log4j -->  
        <property name="proxyFilters">  
            <list>  
                <ref bean="stat-filter" />  
                <ref bean="log-filter" />  
            </list>  
        </property>  
    </bean>  
      
    <!-- 慢SQL記錄-->  
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">  
        <property name="mergeSql" value="true" />  
        <property name="slowSqlMillis" value="10000" />  
        <property name="logSlowSql" value="true" />  
    </bean>  
      
    <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">  
        <!-- <property name="resultSetLogEnabled" value="false" /> -->  
        <!-- <property name="statementExecutableSqlLogEnable" value="true" /> -->  
    </bean>  
      
    <!-- 配置druid監控spring jdbc -->  
    <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" />  
   
    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">  
        <property name="patterns">  
            <list>  
                <value>com.XXX.stat.service.*</value>  
                <value>com.XXX.stat.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>  
</beans>  
  儘管Druid已經說明只須要配置數據庫中的url地址就能夠幫咱們自動來匹配driverClassName,可是發現若是不配置這個,日誌中老是有一些警告,因此就配置了一下。官網提供了一下他本身的driverClassName有:
dbc:derby:=org.apache.derby.jdbc.EmbeddedDriver       
jdbc:mysql:=com.mysql.jdbc.Driver  
jdbc:log4jdbc:=net.sf.log4jdbc.DriverSpy  
jdbc:oracle:=oracle.jdbc.driver.OracleDriver  
jdbc:microsoft:=com.microsoft.jdbc.sqlserver.SQLServerDriver       
jdbc:jtds:=net.sourceforge.jtds.jdbc.Driver    
jdbc:postgresql:=org.postgresql.Driver     
jdbc:fake:=com.alibaba.druid.mock.MockDriver       
jdbc:hsqldb:=org.hsqldb.jdbcDriver     
jdbc:db2:=COM.ibm.db2.jdbc.app.DB2Driver  
jdbc:sqlite:=org.sqlite.JDBC       
jdbc:ingres:=com.ingres.jdbc.IngresDriver      
jdbc:h2:=org.h2.Driver     
jdbc:mckoi:=com.mckoi.JDBCDriver  
  接下來講一下web.xml中的配置參數都有什麼,這裏你也能夠配置loginUserName和loginPassword,避免全部的人均可以看到你本身的數據庫狀況。這樣子在你登陸監控頁面的時候就必須輸入密碼才能夠訪問了。固然也能夠把你的IP加到allow之中,這樣就只有你本身的機器能夠訪問這個監控界面了。例:
<filter>  
        <filter-name>DruidWebStatFilter</filter-name>  
        <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>  
        <init-param>  
            <!-- 常常須要排除一些沒必要要的url,好比.js,/jslib/等等。配置在init-param中 -->  
            <param-name>exclusions</param-name>  
            <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>  
        </init-param>  
        <!-- 缺省sessionStatMaxCount是1000個。你能夠按須要進行配置 -->  
        <init-param>  
            <param-name>sessionStatMaxCount</param-name>  
            <param-value>1000</param-value>  
        </init-param>  
        <!-- druid 0.2.7版本開始支持profile,配置profileEnable可以監控單個url調用的sql列表 -->  
        <init-param>  
            <param-name>profileEnable</param-name>  
            <param-value>true</param-value>  
        </init-param>  
        <init-param>  
            <param-name>principalSessionName</param-name>  
            <param-value>users.username</param-value>  
        </init-param>  
        <!-- 你能夠關閉session統計功能   
        <init-param>   
            <param-name>sessionStatEnable</param-name>   
            <param-value>true</param-value>  
        </init-param> -->  
    </filter>  
       
    <servlet>  
        <servlet-name>DruidStatView</servlet-name>  
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
        <!--   
            deny優先於allow,若是在deny列表中,就算在allow列表中,也會被拒絕。  
            若是allow沒有配置或者爲空,則容許全部訪問  
         -->  
        <init-param>  
            <param-name>allow</param-name>  
            <param-value>128.242.127.1/24,127.0.0.1</param-value>  
        </init-param>  
        <init-param>  
            <param-name>deny</param-name>  
            <param-value>192.168.1.118</param-value>  
        </init-param>  
        <!-- 在StatViewSerlvet輸出的html頁面中,有一個功能是Reset All,執行這個操做以後,會致使全部計數器清零,從新計數 -->  
       <span style="white-space:pre"> </span><init-param>  
            <span style="white-space:pre">    </span><param-name>resetEnable</param-name>  
            <span style="white-space:pre">    </span><param-value>false</param-value>  
        <span style="white-space:pre">    </span></init-param>  
        <span style="white-space:pre">    </span><!--  用戶名和密碼 -->  
        <span style="white-space:pre">    </span><init-param>  
            <param-name>loginUsername</param-name>  
            <param-value>druid</param-value>  
        </init-param>  
        <init-param>  
            <param-name>loginPassword</param-name>  
            <param-value>druid</param-value>  
        </init-param>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>DruidStatView</servlet-name>  
        <url-pattern>/druid/*</url-pattern>  
    </servlet-mapping>  
配置好web.xml以後,啓動本身的JavaWeb服務,訪問一下地址就能夠看到Druid的監控界面。我在這裏的訪問地址是:http://192.168.1.118:8778/druid-monitor/druid/sql.html
   
輸入用戶名密碼(druid/druid)就能夠進入監控頁面。
 
2.Druid Monitor監控JavaSE項目
  監控javaSE項目能夠經過jmx訪問遠程服務端,也能夠經過到服務端運行官網提供的druidStat.sh命令。先說明一下怎麼經過Jmx來訪問,這一種既方便也不至於登陸生產環境的服務器。
  首先既然須要使用Jmx來訪問,那麼服務端就必須提供Jmx的訪問端口和IP地址。那麼須要在咱們的啓動文件中增長java的運行參數。須要添加-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname -Dcom.sun.management.jmxremote.port -Dcom.sun.management.jmxremote.authenticate -Dcom.sun.management.jmxremote.ssl參數來暴漏本身的服務器地址。例:linux的運行腳本  
RESINWEBINF=/home/v31/common-biz  
LIBDIRS=${RESINWEBINF}/lib  
CP=.:${RESINWEBINF}/resources  
for Jars in `ls ${LIBDIRS}`  
do  
CP=${CP}:${LIBDIRS}/${Jars}  
done  
  
java  -Xms2048m -Xmx2048m -cp ${CP}   -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.76  -Dcom.sun.management.jmxremote.port=9004  -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false  com.company.main.StartMain  >>logs/error.log 2>&1 &  

 

而後再部署一個web項目來訪問這個JMX的IP和端口。啓動服務,檢查咱們的端口是否已經啓動
 
最後在咱們本地的web.xml中配置jmxUrl地址來訪問就能夠查看到數據源的監控數據。例
<servlet>  

<servlet-name>DruidStatView</servlet-name>  

<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  

<!-- 遠程訪問JavaSE項目使用jmx鏈接 -->  

<init-param>  

<param-name>jmxUrl</param-name>  

<param-value>service:jmx:rmi:///jndi/rmi://192.168.1.76:9004/jmxrmi</param-value>  

</init-param>  

</servlet>  

<servlet-mapping>  

<servlet-name>DruidStatView</servlet-name>  

<url-pattern>/druid/*</url-pattern>  

</servlet-mapping>  

  配置好這些以後訪問咱們本身的web容器,發現果真能夠查看統計信息了。還有人使用jconsole來訪問,這個我沒有嘗試過,由於以爲那個操做對我來講太麻煩了。web

3.Druid Monitor監控,使用druidStat.shspring

  這個命令腳本在git源碼的druid\src\main\scripts目錄下,
druidStat.bat腳本爲:sql

@echo off  
  
rem Copyright 1999-2011 Alibaba Group Holding Ltd.  
rem   
rem Licensed under the Apache License, Version 2.0 (the "License");  
rem you may not use this file except in compliance with the License.  
rem You may obtain a copy of the License at  
rem   
rem      http://www.apache.org/licenses/LICENSE-2.0  
rem   
rem Unless required by applicable law or agreed to in writing, software  
rem distributed under the License is distributed on an "AS IS" BASIS,  
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
rem See the License for the specific language governing permissions and  
rem limitations under the License.  
  
  
set _RUNJAVA="%JAVA_HOME%\bin\java.exe"  
set _TOOLSJAR="%JAVA_HOME%\lib\tools.jar"  
  
%_RUNJAVA% -classpath "./druid-0.2.6.jar;%_TOOLSJAR%" com.alibaba.druid.support.console.DruidStat %*  
druidStat.sh腳本爲:
#!/bin/sh  
  
if [ -z "$JAVA_HOME" ] ; then  
  echo "Error: JAVA_HOME is not defined."  
  exit 1  
fi  
  
"$JAVA_HOME/bin/java" -Dfile.encoding="UTF-8" -cp "./druid-0.2.6.jar:$JAVA_HOME/lib/tools.jar" com.alibaba.druid.support.console.DruidStat  $@  
有了這個腳本,咱們就能夠直接在服務器上運行看到統計信息。這裏我只說明一下linux的查看方式。咱們修改一下druidStat.sh的druid-0.2.6.jar的目錄和名稱,而後放到本身的服務器上運行便可。先說明一下命令的使用方法吧。
  看到了druidStat.sh的命令幫助,相信你們已經會了一多半了。接下來講明一下怎麼使用。直接上圖:
若是須要查看某一個ID的具體狀況,可使用-id -detail來查看sql的詳情。
 
結尾:提供一個本項目的下載地址: http://download.csdn.net/detail/binglovezi/9422882
這個只是一個tomcat的運行項目包,而非源碼包,因此直接複製到本身的tomcat中,而後修改其中的參數便可,不要導入到本身的eclipse中了。
 
相關文章
相關標籤/搜索