数据库连接池是一组连接集合,一般在应用启动时完成连接创建,减少查询场景发生时创建数据库连接的时间消耗。
一个连接池组件至少需要完成连接创建和收回,实现过程中往一个数组中放入创建完成的连接,用时从数组取出,数据元素减1,用完放回,数据元素加1。取出和放回连接都需要进行加锁。
druid由于采用ReentrantLock可重入锁,公平模式;早期采用非公平模式并发性好,但是非公平性表现比较明显,导致部分获取连接的操作等待时间过长甚至超时。
spring boot 2.0默认的数据库连接池HikariCP,此款连接池在各项基准测评中表现出极高的性能。druid作者曾在github上对于druid和HikariCP的ops比较做了回应,回应指出druid设计初衷是为提供sql执行过程中的监控信息,而且经历阿里系长期大规模验证(官方的说法是只有jboos和druid连接池保持了稳定性)。所以,如果是追求卓越的性能,可以尝试HikariCP连接池;如果追求稳定性和监控、扩展等能力推荐druid。原文见:https://github.com/brettwooldridge/HikariCP/issues/232。
大致过程由一个github名为manikantag的小伙说你这个druid不够快呀,然后温少坐不住了,说我这个druid主要是监控和扩展,而且双十一用的倍爽云云。诚然druid已经在java应用中广泛应用,HikariCP的稳定性就待时间考验吧。
一些其他特性:https://github.com/alibaba/druid/wiki/FAQ
一个数据库连接池还应具备以下特性:
- 扩容:根据最大连接数配置,创建新连接。
- 缩容:根据最大活跃连接数,空闲连接数,空闲时间,回收连接
。 - 保活:定期执行特定SQL,确保连接存活性。