Druid数据库连接池监控详解

目录

1、Druid数据连接池简介

2、druid监控

2.1、下载druid包 

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

2.3、applicationContext.xml数据源的配置:

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

2.5、开启慢sql监控

2.6、开启spring监控


1Druid数据连接池简介

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

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

        Druid是一个JDBC组件,它包括三部分:

        DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系

        DruidDataSource 高效可管理的数据库连接池

        SQLParser

Druid可以做什么

  1. 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
  2. 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
  3. 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
  4. SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

2druid监控

  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.2applicationContext.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.3applicationContext.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.4web.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可以做到方法级别的监控,这个功能可以让你发现方法的调用频率及方法的运行时间,及时做出调整和修正使得项目更健壮。

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
druid数据库连接池是一个开源的Java数据库连接池。它通过提供高效的、可靠的连接管理和监控功能,帮助开发人员更好地管理数据库连接并提高系统性能。使用druid连接池,你可以实现数据库连接的复用、连接的自动管理、连接的监控和统计等功能。 在使用druid连接池时,你需要按照以下步骤进行配置和使用: 1. 添加druid依赖:在项目的pom.xml文件中添加druid的依赖。 2. 配置数据源:在项目的配置文件中配置druid数据源的相关信息,包括数据库的URL、用户名、密码等。 3. 初始化数据源:在项目启动时,通过编程方式初始化druid数据源,并将其注册到JNDI或者使用Spring等框架进行管理。 4. 获取连接:通过druid数据源的getConnection()方法获取数据库连接。 5. 使用连接:使用获取到的数据库连接执行SQL语句,进行数据库操作。 6. 关闭连接:在使用完数据库连接后,务必通过调用connection.close()方法将连接释放回连接池。 除了基本的数据库连接管理功能,druid还提供了一些高级特性,例如: - 连接池的监控功能:可以通过配置druid监控管理页面,实时查看连接池的状态、活动连接数、慢SQL等信息。 - SQL防火墙功能:可以对SQL进行实时监控和审计,以防止SQL注入等安全问题。 - 配置参数的动态修改:可以通过监控管理页面或者JMX接口动态修改连接池的配置参数,而无需重启应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

棉花糖老丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值