此次洒家是在现有项目上测试druid连接池,从一个开发者的角度体验druid的集成便利程度/稳定性,以及druid为人称道的监控功能.

 官方 github 地址:https://github.com/alibaba/druid/wiki/常见问题

废话不多说,贴上常规集成druid方法,其实很简单;

第一步:pom中添加druid依赖: 

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.0.29</version>
</dependency>复制代码


第二步:spring配置文件中定义数据源

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
   <!-- 基本属性 url、user、password -->
   <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="5" />
   <property name="minIdle" value="20" />
   <property name="maxActive" value="200" />
   <property name="maxWait" value="60000" />
   <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
   <property name="timeBetweenEvictionRunsMillis" value="60000" />
   <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
   <property name="minEvictableIdleTimeMillis" value="300000" />
   <property name="validationQuery" value="SELECT 'x'" />
   <property name="testWhileIdle" value="true" />
   <property name="testOnBorrow" value="false" />
   <property name="testOnReturn" value="false" />
   <property name="removeAbandoned" value="true" />
   <property name="removeAbandonedTimeout" value="1800" />
   <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
   <property name="poolPreparedStatements" value="true" />
   <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
   <!-- 配置监控统计拦截的filters -->
   <property name="filters" value="stat" />
</bean>复制代码



第三步:web.xml中添加如下即可实现监控,如果仅仅想使用连接池也可不做这步配置



<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>
<!-- druid的Servlet -->
<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>复制代码



至此我们已经配置完毕,按理说是可以跑起来的,但我这边还是出了一些问题,这个后面说,我们先看看成功后的效果:

1.项目成功启动后,输入http://ip:端口+/druid/即可进入Druid Web URI Sta页面




提供了sql监控页面:


对比一下pg_stat_statements插件监控sql的效果


还有 URl监控页面


对比洒家自用的monitor访问日志监控工具效果


druid提供的监控效果如何不言而喻;

2.接下来说说druid的集成难易程度,集成过程中还是遇到一些问题的,对于现成的项目切换成druid连接池甚至还需要改java源码(如果业务上用到的话)

问题a:若数据库为镜像数据库(比如docker部署的postgres镜像数据库),则切换为druid后会报错无法启动项目:


若将数据库改为本地或者云数据库都可以成功启动,唯独使用使用镜像数据库会有这个问题(或许是配置的问题?有知道的少侠告知一下)

问题b:对现成项目切换为druid连接池可能产生代码报错



总结:

缺点1.对数据库为镜像数据库如docker部署的postgres会报错服务起不来,看了官网文档暂时未找到解决办法 

2.url监控有数据但是统计还差那么一点点细颗粒度比如一般要看特定时间范围内特定接口的平均/最大最小响应时间这个不明白为啥他没做全,并且他的数据似乎不能存入数据库,可以存入日志,我觉得还是直接存入数据库的好 

3.对于现有的项目从别的连接池迁移到druid连接池可能造成未知报错,继而需要改底层业务代码,对代码的入侵性还是有一些的 对比:将druid监控拆解开来看,每一项都没有做到最好,每一项都有对应市面上做得更好的, 如对sql的统计没有pg_stat_statements(一般运维会装的独立的数据库监控组件)统计的详细, 对url的监控没有monitor.jar统计颗粒度细  

一句话概括druid提供的监控确实挺方便,能够满足简单需求,适合新项目且监控要求不高的应用场景;如果是现有维护中的项目,或者监控要求较高的项目,druid明显可以做得更好;