使用Druid監控SQL

今天把C3P0連接池更換了Druid數據,沒有想到Druid監控SQL如此強大,以下是我配置Druid數據源步驟

Druid介紹
Druid是一個JDBC組件庫,包括數據庫連接池、SQL Parser等組件。DruidDataSource是最好的數據庫連接池。

Druild包獲取
Maven工程中添加druid依賴包:

	<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>1.0.26</version>
	</dependency>

Druid使用
更換sping-jdbc.xml配置把c3po更換Druid數據源

  <!-- 配置獲取連接等待超時的時間 --> 
  <property name="maxWait" value="10000" />

  <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 --> 
  <property name="timeBetweenEvictionRunsMillis" value="60000" />

  <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> 
  <property name="minEvictableIdleTimeMillis" value="300000" />

  <property name="testWhileIdle" value="true" />

  <!-- 這裏建議配置爲TRUE,防止取到的連接不可用 --> 
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />

  <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> 
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

  <!-- 這裏配置提交方式,默認就是TRUE,可以不用配置 -->
  <property name="defaultAutoCommit" value="true" />
  
  
  <!--開啓監聽  -->
   <property name="filters" value="stat,log4j"/>
StatViewServlet配置 Druid內置提供了一個StatViewServlet用於展示Druid的統計信息。

這個StatViewServlet的用途包括:

提供監控信息展示的html頁面
提供監控信息的JSON API
提供session信息
需要配置在你web應用中的WEB-INF/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>

配置完之後,可以通過如下格式的地址在瀏覽器訪問查看。

可以通過如下URL訪問。(localhost爲IP port爲8080,kis-ui爲項目名稱)

http://localhost:8088/kis-ui/druid/index.html 如下圖

如果想要訪問的時候需要驗證,則需要提供用戶名和密碼作爲驗證呢,而不是直接就能看JDBC執行的狀態信息

需要在上述配置的情況下,配置Servlet的 loginUsername 和 loginPassword這兩個初始參數。

<servlet>
	<servlet-name>DruidStatView</servlet-name>
	<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  <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>

配置好之後,登錄之後才能訪問。

如果沒有配置StatFilter,那麼,我們無法獲取相關統計信息。

比如:

無法看到SQL監控TAB上的數據。

如何展示出這些數據呢? 解決的辦法就是配置StatFilter。

StatFilter的別名是stat,在spring中使用別名配置方式如下:

在URI監控頁,可以清楚地看到執行某個動作,關聯SQL有多少,請求次數、執行時間、併發數等信息。

StatFilter可以和其他的Filter配置使用,比如, 與log4j組合使用。

[INFO ][2016-11-15 20:11:11,677] com.alibaba.druid.pool.DruidDataSourceStatLoggerImpl.log(DruidDataSourceStatLoggerImpl.java:77) -
{“url”:“jdbc:mysql://127.0.0.1:3306/kis-ui?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull”,“dbType”:“mysql”,“name”:“DataSource-958465974”,“activeCount”:0,“poolingCount”:1,“connectCount”:0,“closeCount”:0}
內置Filter別名和對應的Filter類名如下:

別名 Filter類名
default com.alibaba.druid.filter.stat.StatFilter
stat com.alibaba.druid.filter.stat.StatFilter
mergeStat com.alibaba.druid.filter.stat.MergeStatFilter
encoding com.alibaba.druid.filter.encoding.EncodingConvertFilter
log4j com.alibaba.druid.filter.logging.Log4jFilter
log4j2 com.alibaba.druid.filter.logging.Log4j2Filter
slf4j com.alibaba.druid.filter.logging.Slf4jLogFilter
commonlogging com.alibaba.druid.filter.logging.CommonsLogFilter
慢SQL記錄
StatFilter屬性slowSqlMillis用來配置SQL慢的標準,執行時間超過slowSqlMillis的就是慢。slowSqlMillis的缺省值爲300,也就是300毫秒。

顯示效果圖如下,當執行sql語句超過了300毫秒,執行的

Wallfilter配置
配置WallFilter,可以起到攔截作用,從而形成SQL的白名單和黑名單。

缺省情況下,配置裝載的目錄如下:

數據庫類型 目錄
mysql META-INF/druid/wall/mysql
oracle META-INF/druid/wall/oracle
sqlserver META-INF/druid/wall/sqlserver
postgres META-INF/druid/wall/postgres



<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
	<property name="dbType" value="db2" />
	<property name="config" ref="wall-filter-config" />
</bean>

<!-- 日誌輸出 -->
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
     <!-- 所有連接相關的日誌 -->
    <property name="connectionLogEnabled" value="false"/>
    <!-- 所有Statement相關的日誌 -->
    <property name="statementLogEnabled" value="false"/>
    <!-- 是否顯示結果集 -->
    <property name="resultSetLogEnabled" value="true"/>
    <!-- 是否顯示SQL語句 -->
    <property name="statementExecutableSqlLogEnable" value="true"/>
</bean>


<property name="proxyFilters">
	<list>
	    <!--慢SQL記錄  監聽  -->
	    <ref bean="stat-filter"/>
	      <!--過濾永真條件 防止注入-->
		<ref bean="wall-filter" />
		<!--日誌輸出  -->
		<ref bean="log-filter"/>
	</list>
</property>
配置好Wallfilter, 我們就可以看到SQL防火牆 TAB下的內容了。

配置Spring和jdbc的關聯
最後,還有一個Tab的內容沒有展示,那就是Spring監控。

本文在Spring的sping-jdbc.xml配置文件中配置如下信息,支持方法名的攔截。

<bean id="druid-stat-interceptor"
	class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
</bean>

<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
	scope="prototype">
	<property name="patterns">
		<list>
			<value>com.kis.service.*</value>
			<value>com.demo.action.*</value>
		</list>
	</property>
</bean>
<aop:config>
	<aop:advisor advice-ref="druid-stat-interceptor"
		pointcut-ref="druid-stat-pointcut" />
</aop:config>

完工後,我們再去看一下,Spring監控的TAB內容,就可以看到相關的MyBatis Mapper執行信息。

session 信息配置
在web.xml配置,如下代碼 sessionStatEnable 默認關閉(官網上好像超過一個session有bug)

<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>false</param-value>
</init-param>
<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>
DruidStatView /druid/*
 <!-- log4j監聽器 -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<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,*.htm,/druid/*</param-value>
    </init-param>
	<init-param>
		<param-name>principalCookieName</param-name>
		<param-value>USER_COOKIE</param-value>
	</init-param>
	<!-- 開啓session監控 -->
    <init-param>
        <param-name>sessionStatEnable</param-name>
        <param-value>1000</param-value>
    </init-param>
    <init-param>
        <param-name>profileEnable</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

效果圖

非常感謝Druid數據

Druid還有很多其他的功能,在這篇文章中就一一展示,有興趣的朋友可以在Druid的Github網頁上查看。

原文:https://blog.csdn.net/zouliping123456/article/details/81255484

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 5277
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章