当前位置: 代码网 > it编程>编程语言>Java > Druid数据库连接池监控使用及说明

Druid数据库连接池监控使用及说明

2025年12月27日 Java 我要评论
1、druid数据连接池简介druid是java语言中最好的数据库连接池。druid能够提供强大的监控和扩展功能。性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们

1、druid数据连接池简介

druid是java语言中最好的数据库连接池。druid能够提供强大的监控和扩展功能。

性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们找出应用中连接池方面的问题。

druid是一个jdbc组件,它包括三部分:

  • druiddriver 代理driver,能够提供基于filter-chain模式的插件体系
  • druiddatasource 高效可管理的数据库连接池
  • sqlparser

druid可以做什么

  • 可以监控数据库访问性能,druid内置提供了一个功能强大的statfilter插件,能够详细统计sql的执行性能,这对于线上分析数据库访问性能有帮助。
  • 替换dbcp和c3p0。druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
  • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。druiddruiver和druiddatasource都支持passwordcallback。
  • sql执行日志,druid提供了不同的logfilter,能够支持common-logging、log4j和jdklog,你可以按需要选择相应的logfilter,监控你应用的数据库访问情况。

2、druid监控

druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

2.1、下载druid包

maven配置:

<!--  阿里druid 数据源 start  -->

 <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->

<dependency>

    <groupid>com.alibaba</groupid>

    <artifactid>druid</artifactid>

    <version>1.1.10</version></dependency>

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --><dependency>

    <groupid>org.slf4j</groupid>

    <artifactid>slf4j-api</artifactid>

<version>1.7.25</version>

</dependency>

<!--  阿里druid 数据源 end  -->

最新版druid 引用了slf4j 所以需要一并加入,否则会报找不到slf4的错误。

2.2、applicationcontext.xml引入配置文件数据库连接相关信息

<!-- 引入配置文件 --> 

    <bean id="propertyconfigurer" 

        class="org.springframework.beans.factory.config.propertyplaceholderconfigurer"> 

         <property name="location" value="classpath:jdbc.properties" />

    </bean> 

jdbc.properties 中配置数据库链接信息:

jdbc.driver=oracle.jdbc.driver.oracledriver
jdbc.url=jdbc:oracle:thin:@10.110.3.17:1521:实例名
jdbc.username=user
jdbc.password=password

2.3、applicationcontext.xml数据源的配置

<!--  阿里druid 数据源 datasource  start  -->
<bean id="datasource" class="com.alibaba.druid.pool.druiddatasource"
  init-method="init" destroy-method="close">
  <property name="driverclassname" value="${jdbc.driver}" />
  <property name="url" value="${jdbc.url}" />
  <property name="username" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
  <!-- 配置初始化大小、最小、最大 -->
  <property name="initialsize" value="10" />
  <property name="minidle" value="10" />
  <property name="maxactive" value="50" />
  <!-- 配置获取连接等待超时的时间 -->
  <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" />
  <!-- 验证连接有效与否的sql,不同的数据配置不同  mysql:select 1  ;oracle : select 1 from dual -->
  <property name="validationquery" value="select 1 from dual" />
  <property name="filters" value="wall,stat" />
  <property name="proxyfilters">
   <list>
    <ref bean="logfilter" />
    <ref bean="stat-filter" />
   </list>
  </property>
 </bean>
     <!-- 慢sql记录 -->
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.statfilter">
        <!-- 慢sql时间设置,即执行时间大于50毫秒的都是慢sql -->
        <property name="slowsqlmillis" value="50"/>
        <property name="logslowsql" value="true"/>
    </bean>
      <bean id="logfilter" class="com.alibaba.druid.filter.logging.slf4jlogfilter">
      <property name="datasourcelogenabled" value="true" />
      <property name="statementexecutablesqllogenable" value="true" />
     </bean>
    
     <!--  阿里druid 数据源 datasource  end  -->    

2.4、web.xml中加入监控配置

只需要在web.xml中做一下简单的servlet配置即可。

<!--连接池启用web监控统计功能start -->
    <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,/druid/*</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>druidwebstatfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <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>yourname</param-value>
        </init-param>
        <init-param>
            <!-- 密码 -->
            <param-name>loginpassword</param-name>
            <param-value>yourpassword</param-value>
        </init-param>
       
       
    </servlet>
    <servlet-mapping>
        <servlet-name>druidstatview</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>
<!--连接池启用web监控统计功能end-->

重新构建工程并启动tomcat,启动项目http://ip:端口/项目名称/druid/即可进入到druid监控面板的登录页面,如下图。

输入在web.xml中配置的账号和密码即可进入监控后台,注意,配置的账号和密码是明文,你在这里配置什么就是什么,并没有经过加密。

ok,我们看到系统的一些简述信息,当然,你也应该看到启动时间了.

接下来是比较重要的一个页面,sql监控:

从这个页面里我们能看到网站从启动开始执行的sql语句统计,每一条语句的执行次数、执行时间之和、最慢执行时间、执行错误数等等多个统计指标,通过这个统计数据我们可以找出sql语句的执行规律及sql语句的不足之处,也可以通过错误数来定位程序的不足并及时修改。

在配置druid数据源时,做了如下配置,开启了druid防火墙。

 <property name="filters" value="wall,stat"/>

因此在控制后台也能见到sql防火墙面板,如下图所示:

面板里是防御统计及sql的统计信息,这里用的是druid默认的一些过滤规则,并没有自定义复杂的防火墙规则,因此也不细说了。

2.5、开启慢sql监控

在sql监控中,有一项关于sql执行最慢执行时间的统计,但是只有一个值,就是一条sql语句最慢的执行时间记录,其他执行时间是看不到的,只能通过总时间来进行粗略的估计,还有一个问题就是,一旦项目重启,这些记录就全都没了,因此制定对应的日志输出策略是极其必要的。

大致想法就是通过druid获取所有项目运行中的慢sql执行记录,并将这些数据输出到日志文件中,查了一下druid的资料,调试了一段时间,最终成功实现。

1、修改数据源配置,增加拦截器:

<property name="proxyfilters">
   <list>
    <ref bean="logfilter" />
    <ref bean="stat-filter" />
   </list>
  </property>

2、配置慢sql及日志拦截器:

<!-- 慢sql记录 -->
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.statfilter">
        <!-- 慢sql时间设置,即执行时间大于50毫秒的都是慢sql -->
        <property name="slowsqlmillis" value="50"/>
        <property name="logslowsql" value="true"/>
    </bean>
      <bean id="logfilter" class="com.alibaba.druid.filter.logging.slf4jlogfilter">
      <property name="datasourcelogenabled" value="true" />
      <property name="statementexecutablesqllogenable" value="true" />
     </bean>

3、修改log4j 配置文件,增加慢sql日志的输出策略:

#--------------------增加druid监控日志输出
log4j.rootlogger=debug, console ,druid

#console 
log4j.appender.console=org.apache.log4j.consoleappender 
log4j.appender.console.layout=org.apache.log4j.patternlayout 
log4j.appender.console.layout.conversionpattern=%d [%t] %-5p [%c] - %m%n 

log4j.logger.java.sql.resultset=info 
log4j.logger.org.apache=info 
log4j.logger.java.sql.connection=debug 
log4j.logger.java.sql.statement=debug 
log4j.logger.java.sql.preparedstatement=debug 
#log4j.rootlogger=debug,debug,druid
# druid    -------------------增加druid监控日志输出
log4j.logger.druid.sql=warn,druid
log4j.logger.druid.sql.datasource=warn,druid
log4j.logger.druid.sql.connection=warn,druid
log4j.logger.druid.sql.statement=warn,druid
log4j.appender.druid=org.apache.log4j.dailyrollingfileappender
log4j.appender.druid.layout=org.apache.log4j.patternlayout
log4j.appender.druid.layout.conversionpattern= [%d{hh\:mm\:ss}] %c{1} - %m%n
log4j.appender.druid.datepattern='.'yyyy-mm-dd
log4j.appender.druid.threshold = warn
log4j.appender.druid.append=true
log4j.appender.druid.file=${catalina.home}/logs/ssm-maven/druid-slow-sql.log

重启再去查看druid监控后台,可以看到跟原来有了一些差别,由于设置了慢sql的时间为大于50毫秒,所以执行时间大于50毫秒的都会被红色标注。

再去tomcat日志文件夹中查看日志文件,可以看到日志文件中已经存在配置的慢sql日志文件了,点击查看其中也已经有了慢sql记录的数据,慢sql以及这条sql语句执行的时间都有记录。

2.6、开启spring监控

在监控面板中看到有spring监控这个功能,如果没有进行配置,则功能不能用,查了一下druid的文档,最终开启了spring监控功能。

配置如下:

<!--  阿里druid spring监控  start  -->    
    <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.inspur.smvc.service.*</value>
                <value>com.inspur.smvc.dao.*</value>
            </list>
        </property>
    </bean>
    <aop:config>
        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>
    </aop:config>
<!--  阿里druid spring监控  end  -->   

再次查看spring监控页面,已经有了数据:

原先的做法只能对sql语句及jdbc相关操作进行监控,无法监控到代码级别的运行,因此进一步设置,结合springaop特性对代码的运行效果进行监控,druid可以做到方法级别的监控,这个功能可以让你发现方法的调用频率及方法的运行时间,及时做出调整和修正使得项目更健壮。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com