使用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

Java可以使用Druid来连接数据库,并使用Druid API修改SQL语句。Druid是一个高性能、可靠的开源数据库连接池,它支持JDBC和ODBC,可以为Java应用程序提供高效的数据访问。 下面是一个简单的使用Druid修改SQL语句的示例代码: ```java import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidPooledConnection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { public static void main(String[] args) throws SQLException { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("password"); DruidPooledConnection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement("update users set name = ? where id = ?"); statement.setString(1, "newName"); statement.setLong(2, 123); int updateCount = statement.executeUpdate(); System.out.println("Updated " + updateCount + " rows."); statement.close(); connection.close(); } } ``` 这个示例代码连接到本地MySQL数据库,修改了一个名为“users”的表中ID为123的行的“name”列的值。首先,创建了一个Druid数据源,并设置了数据库连接的URL、用户名和密码。然后,从数据源中获取一个连接,并准备执行SQL语句。使用`PreparedStatement`类设置要修改的值和条件,并使用`executeUpdate()`方法执行SQL语句。最后,关闭语句和连接。 需要注意的是,这个示例代码没有使用Druid的一些高级功能,如连接池的管理和监控等。在实际开发中,应该根据实际情况配置和使用Druid,以提高数据库访问的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值