Druid Monitor監控Java Web和Java SE項目


Druid Monitor

  對於數據源,大家已經接觸了不少了。比如c3p0、dhcp、proxool等,之后又發現使用tomcat-jdbc可以大大的提高性能。但是針對於我們的高並發的系統來說,總希望能找到一個性能更好、更穩定的產品來代替。在開源中國上偶然發現了很多公司都在使用Druid這個數據源,然后搜索了一些相關資料,有人提供了這幾個數據源的性能測試報告,突然發現這個數據源以很好的性能已經被大家普遍使用了。於是就想深入的研究一下這個數據源了。其實很多項目都是JavaSE的,但是官網針對於JavaSE的項目又沒有具體說明應該怎么使用其監控統計功能。於是自己就看了一下源碼發現了有配置jmxUrl的地方,可以想想這個應該就是針對於遠程監控項目的配置了。在這里我就整理一下自己的使用情況供以后的人員參考,如果有錯誤的地方,也請大牛指證,我也多學習學習。

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

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

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

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

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

1.Druid Monitor監控Java Web項目

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

<?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來訪問,這個我沒有嘗試過,因為覺得那個操作對我來說太麻煩了。

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

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

@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中了。
 


免責聲明!

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



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