参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html

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,监控你应用的数据库访问情况。

druid监控

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

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、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

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

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默认的一些过滤规则,并没有自定义复杂的防火墙规则,因此也不细说了。

开启慢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,druidlog4j.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语句执行的时间都有记录。

开启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相关操作进行监控,无法监控到代码级别的运行,因此进一步设置,结合spring的AOP特性对代码的运行效果进行监控,druid可以做到方法级别的监控,这个功能可以让你发现方法的调用频率及方法的运行时间,及时做出调整和修正使得项目更健壮。

转载于:https://www.cnblogs.com/prefectjava/p/9397999.html

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句...相关推荐

  1. alibaba的druid连接池的监控的两种方法

    alibaba的druid连接池的监控的两种场景 一.导入druid包,适用spring.springboot 1.导包(版本自选) 这里省略了数据库的其他包只关注druid的相关 <depen ...

  2. 查看mysql某人执行了什么语句_详解MySQL如何监控系统全部执行过的sql语句

    概述 考虑这么一个场景,开发系统时有个模块执行很慢,但是又不知道这中间涉及到什么sql,就可以设想在没什么业务量的时候来监控数据库全部执行过的sql语句,方便排查问题. 涉及命令 1.开启genera ...

  3. mysql 记录执行的sql_MySQL监控全部执行过的sql语句

    MySQL监控全部执行过的sql语句 查看是否开启日志记录 show variables like "general_log%" ; +------+----+ |Variable ...

  4. 线上问题分析系列:数据库连接池内存泄漏问题的分析和解决方案

    前言 本文来自好朋友彪哥整理,实际的生产问题分析,绝对干货~ 一.问题描述 上周五晚上主营出现部分设备掉线,经过查看日志发现是由于缓存系统出现长时间gc导致的.这里的gc日志的特点是: 1.gc时间都 ...

  5. easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池

    如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...

  6. mysql 常用数据库连接池_常见的数据库连接池

    欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 2.C3P0 在Hibernate和Spring中默认支持该数据库连接池 需要引入:c3p0-0.9.1.2.jar包,如果 ...

  7. python 数据库连接池_【转】Python 数据库连接池

    python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因 ...

  8. java面试 数据库连接池_阿里面试官:数据库连接池有必要吗?你对它的底层实现了解过没?...

    # 前言 数据库连接池的基本思想是:为数据库连接建立一个"缓冲池",预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避 ...

  9. java数据库连接Druidsql失败_Druid数据库连接池异常connection holder is null

    Druid数据库连接池异常connection holder is null 具体如下:### Error updating database.  Cause: java.sql.SQLExcepti ...

最新文章

  1. 逻辑回归、决策树和支持向量机(I)
  2. 评估指标_供应链改进常用评估指标
  3. 信息系统项目管理师-知识产权、项目收尾、标准规范核心知识点思维脑图
  4. 汽车电子嵌入式技术篇(二) -autosar中的嵌入式系统函数的调用
  5. 【转贴】利用 Javascript 获取 URL 参数(适合IE、FF)
  6. linux 审计oracle,开启和关闭oracle数据库中的审计功能
  7. ftk学习记(输入法篇)
  8. 空中楼阁成语故事,空中楼阁用来比喻什么?
  9. 二十多年了,安全套市场还只有杜蕾斯、冈本、杰士邦
  10. 达梦DM单机部署以及日常运维管理
  11. IIS提示您未被授权查看该页 401.1解决办法
  12. 【洛谷】P4147 玉蟾宫 解题报告
  13. python四边形转矩形_如何用PIL将矩形图像映射成四边形?
  14. ics日历 android,哪些日历 App 支持导入 ics 或 webcal 协议订阅?
  15. 次世代贴图材质制作的提示和秘籍
  16. 视频剪辑学习笔记(1)
  17. 维特智能六轴姿态传感器JY61P_stm32f1xx驱动代码解析
  18. 基础-02-日语中为何会有体言用言?
  19. winpe 能否修复服务器系统,教你如何使用winpe来修复系统
  20. 通过ASM1117实现5V转3.3V电路

热门文章

  1. java string 数据结构_java 数据结构(一):java常用类 一 String类
  2. java国际化 英语的标识符_(转)Java 国际化
  3. 计算机辅助设计工业产品cad竞赛试题,2017工业产品设计CAD比赛试题
  4. Java环境安装手册
  5. 线性判别式分析-LDA-Linear Discriminant Analysis
  6. Android中如何实现多个框,在android中的对话框中设置多个文本框
  7. utittest和pytest中mock的使用详细介绍
  8. python办公入门经典_Python3入门经典100例
  9. python开发内部管理系统_GitHub - JEmbrace/ZYPCManageSystem: 工作室的]内部管理平台
  10. shell脚本ssh登录并执行命令_Linux批量免密码SSH登录案例