Druid数据库连接池和Druid内置监控系统简单介绍


Druid简介

Druid是阿里巴巴的一个开源数据库连接池,基于Apache 2.0协议,可以免费自由使用。但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。Druid能够提供强大的监控和扩展功能Druid只支持JDK 6以上版本,不支持JDK 1.4JDK 5.0

Druid下载:

maven中央仓库: http://central.maven.org/maven2/com/alibaba/druid/

FAQ

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

源代码下载地址:https://github.com/alibaba/druid

Druid支持的数据库

Druid支持所有JDBC兼容的数据库,包括OracleMySqlDerbyPostgresqlSQL ServerH2等等。

Druid针对OracleMySql做了特别优化,比如OraclePS Cache内存占用优化,MySqlping检测优化。

Druid基本配置

Druid数据库连接池的配置与传统的DBCPC3P0Proxool等数据连接池的配置基本相同,下面以使用了Spring的项目为例配置Druid数据库连接池。

1. 在上述的Druid下载路径中下载最新的Druid  jar包,目前最新的为  druid-1.0.2.jar

2. 打开项目中的spring配置文件 applicationContext.xml 文件,加入如下配置

<!-- 配置Druid连接池 -->

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

<!-- 基本的urluserpassword配置 -->

<property name="url" value="jdbc:mysql://localhost:3306/cendev?useUnicode=true&characterEncoding=utf8"></property>

<property name="username" value="root"></property>

<property name="password" value="mysql"></property>

<!-- 配置大小、最大、最小 、超时时间-->

<property name="maxActive" value="100" />  

<property name="initialSize" value="1" />  

<property name="maxWait" value="3600000" />  

<property name="minIdle" value="30" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->

<property name="timeBetweenEvictionRunsMillis" value="60000" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->

<property name="minEvictableIdleTimeMillis" value="300000" />

<property name="validationQuery" value="select CURRENT_DATE" />  

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

<property name="testOnBorrow" value="false" />  

<property name="testOnReturn" value="false" />

<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->

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

<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

<!-- 配置防御SQL注入的filters、监控统计拦截的filters -->

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

<!-- 连接泄露(未关闭)检测  removeAbandoned开启会对性能造成影响,怀疑有泄露情况再打开-->

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

<!-- 超时关闭时间 1800秒,即30分钟。连接30分钟仍未关闭,则会被收回 -->

<property name="removeAbandonedTimeout" value="1800"></property>

</bean>

<!-- 配置Druid连接池 结束-->

 

3. 上面配置中的<property name="filters" value="wall,stat" />  该配置是配置Druid的防御sql注入的filter和监控统计拦截的filter。开启监控拦截另外还需在项目的web.xml中配置相应的Servlet。请在web.xml中加入如下配置。

<!-- 配置druid 连接池监控-->

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

4. 添加完上述配置Druid的基本配置即可重新启动项目输入http://localhost:端口/应用名称/druid/index.html 即可打开Druid内置的监控系统。例如:http://localhost:8080/pm/druid/index.html

5. Druid内置的监控系统页面如下图:

通过上述配置后可以在此监控系统中查看的包括首页、数据源、SQL监控、SQL防火墙(SQL防火墙的filterwall)session监控。至于Web应用、URI监控、Spring监控等暂不能查看,加入后续的配置即可。

Druid内置监控中的WEB关联监控配置

使用内置监控中的WEB关联监控,需要在项目的web.xml文件中加入如下配置:

<!-- web URI监控配置 -->

<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,*.bmp,*.png,*.css,*.ico,*.swf,/druid/*</param-value>

</init-param>

    </filter>

    <filter-mapping>

  <filter-name>DruidWebStatFilter</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

欲了解更多Druid关于WEB监控配置,请移步:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter

Druid内置监控中的Spring关联监控配置

使用内置监控中的Spring关联监控,需要在项目中的spring配置文件applicationContext.xml中加入如下配置:

<!-- 配置DruidSpring拦截器 -->

<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.censoft.app.controller.*</value>

<value>com.censoft.app.dao.*</value>

<value>com.censoft.app.service.*</value>

</list>

</property>

</bean> 

<aop:config>

<aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>

</aop:config>

 

<list>中配置的为需要监控的包路径。欲了解更多关于Druid Spring监控配置请移步:

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_Druid%E5%92%8CSpring%E5%85%B3%E8%81%94%E7%9B%91%E6%8E%A7%E9%85%8D%E7%BD%AE

 

 

 

Druid内置监控系统简单介绍

输入http://localhost:端口/应用名称/druid/index.html 即可打开Druid内置的监控系统。例如:http://localhost:8080/pm/druid/index.html

下面就Druid监控系统中的各功能模块简单介绍一下。

首页

展示Druid版本、jdk版本、重置次数、启动时间等基本信息。

数据源

数据源菜单显示数据库连接池的基本信息如连接地址连接类型最大连接数最小连接数、初始连接等信息。

可通过逻辑连接打开次数、逻辑连接关闭次数来判断系统中是否存在有连接未关闭的情况(正常情况下打开次数和关闭次数应该一致)

SQL监控

SQL监控显示系统已执行过的每条SQL语句的执行情况。通过执行数、执行时间、最慢时间、事务中、错误数、最大并发、执行时间分布等统计维度来展现。

需要说明的有:

执行数:本条sql语句已执行的次数

执行时间:本条sql语句累计执行时间(单位:毫秒)

最慢:本条sql语句执行最慢一次的耗时(单位:毫秒)

执行时间分布【- - - - - - - -:这8 分别代表8个耗时区间的次数,从左至右依次是:

0-1毫秒次数、1-10毫秒次数、10-100毫秒次数、100-1000毫秒次数、1-10秒次数、10-100秒次数、100-1000秒次数、大于1000秒次数。

如下图中的这一条数据:

 

可以发现:执行时间上本条sql语句有10次是在1-10毫秒内就执行完成,其他耗时区间的执行次数都为0.

执行+RS时分布与此同理。通过耗时区间,可以发现SQL执行的效率情况,可以反映出数据库或应用是否稳定。

SQL防火墙

SQL防火墙分防御统计、表访问统计、函数调用统计、SQL防御统计-白名单、SQL防御统计-黑名单这几项。

其中若是涉嫌SQL注入的SQL语句将被拦截,出现在SQL防御统计-黑名单中。详细的SQL防御的wallfilte配置请移步:

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

 

WEB应用

Web应用主要统计本应用的并发、请求、事务提交、事务回滚等信息,另外统计了本应用在各操作系统上、各浏览器上的访问次数。

URI监控

URI监控统计了应用中各url的访问次数、请求时间、并发数等信息。

Session监控

Session监控显示应用中session的请求时间、请求次数、最大并发等数据。

Spring监控

Spring监控显示针对配置中需要监控的各方法的执行数、执行时间、最大并发、读取行数等信息。

Druid数据库连接池如何解决连接泄露

对于项目中可能存在的连接泄露(连接未关闭)的问,Druid提供了如下办法:

1. 可通过“数据源”监控中的“活跃连接堆栈查看 ” 这里显示的是未关闭的数据库连接堆栈信息,可通过此堆栈信息来分析未关闭的数据库连接所在位置,从而手动关闭,解决问题。

点击[View JSON API]可查看堆栈信息,如下图:

可以看到目前并未有发现未关闭连接的情况。

再看下图:

发现堆栈中已有信息可从中分析出是test.jsp中存在未关闭的连接,手动关闭即可。

2. 另外Druid提供了另一种解决办法可在applicationContext.xml的数据库连接池(dataSource)配置中加入如下配置:

<!-- 连接泄露(未关闭)检测  removeAbandoned开启会对性能造成影响,怀疑有泄露情况再打开-->

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

<!-- 超时关闭时间 1800秒,即30分钟。连接30分钟仍未关闭,则会被收回 -->

<property name="removeAbandonedTimeout" value="1800"></property>

 

加入该配置后,若有连接30分钟仍未关闭,则Druid会强制收回此连接,关闭该连接。

3. 若想了解更多Druid关于解决连接泄露的问题请移步

https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B

猜你喜欢

转载自blog.csdn.net/educast/article/details/80678106