又是性能优化的一天之连接池

背景

今天接了个需求,页面任务运行和保存提交按钮等待时间特别长,页面转圈圈,于是充满希望的一天开始了!

问题分析

性能监测,于是乎,我想起了阿里开源性能检测工具arthas(阿尔萨斯),它能监测接口连路上每个方法的运行时间,可以直观的看到接口到底哪一步比较慢,由于我也是刚刚接触这个工具,后续我会专门出一期关于这个工具安装和使用的文章,老铁们不要着急,平常有点忙,文章产量不大,见谅见谅。

运行按钮里面调了多个接口,将任务里面的sql语句按分号截取发给集群运行,任务中有几个sql,就会产生多少个接口,所以导致运行按钮比较慢,这个接口就先放弃吧,然后我看到了另一个接口,如图:

又是性能优化的一天之连接池

isAiTenant这个接口竟然用了3.5s,然后我查看了一下代码,发现:它仅仅他了一次数据库而已,而且表里只有一条数据,我在Navicat客户端中,执行相应的sql,仅仅几毫秒就能执行完毕,那这个问题出在哪里呢?然然后 我用上文提及的性能监测工具阿尔萨斯对改接口进行监控,监控结果如图所示:

又是性能优化的一天之连接池

该接口,确实是有时快,有时慢,快的1ms左右,慢的能达到5s中,然后思考,走的 都是一段代码,sql也非常简单,不应该会出现这么大的差别,然然后我就思考该接口处理逻辑:

1.进入接口

2.从连接池获取连接

3.调用dao方法 访问数据库(总数据量为1)

4.返回结果

我坚定是连接池出了问题,然后我查看项目所使用的连接池,使用了c3p0连接池,我对该连接池根本没有好感,另外之前还爆出有重大bug,我也没想要去优化线程池参数,我下定决心更换线程池,我选用性能更好的阿里开源的druid连接池,经过一系列配置,测试之后,项目启动成功,在此测试该接口,测试100次,测试结果如图:

又是性能优化的一天之连接池

浪里个浪,结果如我所愿,稳定在1ms左右。由于自己改了整个项目数据库连接池,不能仅仅只局限于这一个地方,要对整个项目都没有影响才算更换成功,后续还要测试靓仔阿坤加加油啦!哈哈,别恨我啊,阿坤!

C3p0与Druid性能大比拼

1. c3p0连接池

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
c3p0连接池是全自动化操作,相比于dbcp可以自动回收空闲连接,此外还能自动连接。
C3P0功能简单易用,稳定性好这是它的优点,但是性能上的缺点却让它彻底被打入冷宫。C3P0的性能很差,差到即便是同时代的产品相比它也是垫底的,更不用和Druid、HikariCP等相比了。正常来讲,有问题很正常,改就是了,但c3p0最致命的问题就是架构设计过于复杂,让重构变成了一项不可能完成的任务。随着国内互联网大潮的涌起,性能有硬伤的c3p0彻底的退出了历史舞台。

2. Druid

阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。

Druid主要优点

  1. 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。
    a. 实时监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;
    b. SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0-1毫秒区间50次,1-10毫秒800次,10-100毫秒100次,100-1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况;
    c. 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。

  2. 方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。

  3. Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

又是性能优化的一天之连接池

根据图片你就知道c3p0有多low了!

Druid连接池参数相关优化遇到瓶颈问题再来优化,老铁们可以自行百度优化哦,哦了,我也饿了!

打工人,打工魂,打工都是人上人!

相关文章:

  • 2021-11-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-11
  • 2022-12-23
  • 2021-04-14
猜你喜欢
  • 2021-06-24
  • 2021-05-31
  • 2021-10-04
  • 2021-07-31
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案