近期服务端偶发几起close_wait问题,搞得人心慌慌,按照之前的经验是由于服务端生成的数据量太大,导致 服务端在请求频繁调用之后服务端老年代gc频繁出现的问题,查看代码发现数据库配置的最大连接数是100, 而最小的连接数是50,怀着踹踹不安的心情区看了一下日志,发现数据库在连接为50的时候就已经无法创建新的连接了, 而后查了一下数据库支持的最大连接数是5000,也就是说物理连接的数量既没有超过后台的限制,也没有超过数据库中的限制,因此怀疑数据库 连接没有能够释放,进行了一次druid相关源码的剖析。 摘要: 关键词: poolingPeak:峰值

druid是一阿里巴巴开源的一款数据库连接池管理器,利用池化的思想来管理数据库连接,池化的好处如下:

1、对于创建和销毁代价特别大的资源,池化可以提高资源复用率 2、可以通过池子有效的控制池化资源的数量,这样也可以避免较大的开销

druid号称是为监控而生,既然要做到监控,必然会使用代理:操作的具体行为都是使用代理来完成,在完成的过程中产生监控的数据

druid按照功能可以划分为一下几点

代理

首先要提到的就是代理,既然要做监控,那么肯定是要制造监控的机会,这里的大量使用了代理的设计模式:使用代理类来完成功能的调用 在代理类和实现类中间加入需要监控的事件。对于sql查询,可以监控的对象有:datasource、connection、statement、result,我们可以从一个监控 对象入手来分析,就以statement入手来分析:

数据库连接池管理

数据库连接池管理的话是基于一个数组来实现的,该对象拥有一个池子(数组),一个用于控制生产和消费线程的锁,以及用于创建和消费连接的线程,其流程图如下:

过滤器链

过滤器链是一种设计模式,这种模式将数据的处理抽象到一系列的对象中,并在这些对象中传递事件处理的请求,责任链参与的对象有

  • 事件请求
  • 请求处理对象 简述一下这种设计模式,如下:

小结

druid源码远不止这么些,以上是我自己比较关心的业务的部分,感谢druid的作者温少,让我们可以有膜拜的机会

附:里面大量用到了holder这种命名的规范,这种命名的化可以推测出来其作用:某种资源的持有者