那些好用的数据库连接池都有哪些?
今天我们来聊聊好用的数据库连接池都有哪些?
HikariCP
在前面的SpringBoot配置数据源的例子中我们使用的是SpringBoot默认帮我们配置的数据源。在SpringBoot1.0中使用的是Tomcat的DataSource,而在SpringBoot2.0里面默认就使用了HikariCP。
那么HikariCP就是我们今天带来的第一个好用的连接池。
Hikari其实来源于日语,它的意思是光,由此可见作者的意思非常明显,他就是想说我这个数据源非常快,我们看一下它的github源码介绍。
它里面第一句话就介绍它是一个高性能的JDBC连接池,It‘s Faster它很快。
接下来是一张它和其他数据库连接池的对比图,它对比的连接池包括c3p0、dbcp2、tomcat、还有不太常见的vibur。
从这张对比图左边关于对连接的取放上面,Hikari每毫秒可以做到4万多个,一个Statement的操作,过程包括prepare statement、执行操作、最后是归还,每毫秒可以做14万多个ops。
HikariCP为什么这么快?
首先第一点是因为它做了很多字节码级别的优化,如果你看它的源码可以发现它里面有很多方法根本都没有写,完全是通过JavaAssist在编译的时候动态去生成它的。
关于JavaAssist,这里挖个坑,后面写一篇文章专门去介绍它,你们感兴趣吗?
另外一方面是它在很多这种很小的地方做了各种各样的优化。
自己实现了一个FastStatementList来代替java util中的ArrayList。主要的优化是在列表操作取放的时候节省了一些时间
借鉴了.NET当中的ConcurrentBag的概念。在Java中自己实现了一个无锁集合,这样的话可以在并发操作的时候带来一些性能的优化
代理类的优化。在字节码级别上使用invokestatic代替invokevirtual
针对第三点说一下,上图是早期的版本,可以看到prepareStatement方法中是通过PROXY_FACTORY这个静态成员变量的getProxyPreparedStatement方法来获取我们的PrepareStatement,这种方式我们可以看到生成的字节码指令有18个。
而后面的版本如下图:
可以看到作者直接将静态的成员变量换成了一个类上的静态方法,通过
ProxyFactory.getProxyPreparedStatement
直接获取我们的PrepareStatement,可以看到生成的字节码指令就变成了15个。
所以说Hikari为什么这么快,完全是因为它在各种各样的地方做了各种各样的优化,可以说是积少成多的优化点,最终达到了越来越快的效果。
在SpringBoot中如何使用HikariCP ?
如果你使用的是SpringBoot2.x,那他默认使用就是HikariCP,只需要在配置文件中配置 spring.datasource.hikari.* 配置即可,常用配置参数如下。
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.minimumIdle=10
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.maxLifetime=1800000
其他配置详见HikariCP官网:https://github.com/brettwooldridge/HikariCP
如果使用的SpringBoot1.x,则需要移除tomcat-jdbc依赖,通过配置制定使用HikariCP:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
Alibaba Druid
Druid连接池是阿⾥巴巴开源的数据库连接池项⽬。Druid连接池为监控⽽⽣, 内置强⼤的监控功能,监控特性不影响性能。功能强⼤,能防SQL注⼊,内置 Logging能诊断Hack应⽤⾏为。
-Alibaba Druid 官⽅介绍
Druid是阿里巴巴开源的一个为监控而生的数据源,从它的官方接口就可以看到它的主要的亮点是监控,并且这个监控不会消耗应用程序太多的性能。
在阿里内部的很多系统用的都是Druid数据源,可以说是经过双十一的考验,值得信赖。
它有很多的实用功能:
详细的监控(非常全面)
ExceptionSorter,针对主流数据库的返回码都有支持
SQL防注入
内置加密配置
众多扩展点,方便进行配置
这个是Druid官网的文档,可以看到官网的文档非常齐全,而且都是中文的
https://github.com/alibaba/druid/wiki/常见问题
在SpringBoot中如何使用Druid ?
通过 druid-spring-boot-starter
• spring.datasource.druid.*
我们来看一下一些常用的配置:
Filter 配置
spring.datasource.druid.filters=stat,config,wall,log4j (全部使⽤默认值)
密码加密
spring.datasource.password=<加密密码>
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=<public-key>
SQL 防注⼊
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false
如何选择一个合适的数据源?
总结一下,今天介绍了两个目前主流的好用的数据库连接池HikariCP和Druid,那么我们在实际的开发中应该如何选择使用哪个数据源呢?
这里主要提供上图中的一些可参考的点,首先可靠性和性能是必须的,你肯定希望你的数据库连接池在数据库发生问题或者网络抖动的时候,它能自动发现这些问题,并快速恢复,同时你也希望你的数据库连接池的性能开销尽可能小,这两点是非常重要的。
然后第三是功能,如果数据库能提供类似SQL防注入、加密配置、还有各种各样的监控的功能,只要对性能和稳定性没有任何影响,那多一些也是非常好的。
最后,感谢阅读~
我是Seven,一个不懈努力的程序猿,希望本文能对你有所裨益
往期文章
喜欢就点个"在看"呗^_^