1、由于程序创建和数据库的连接需要开销(JDBC的创建一个Connection),数据库连接池用于存放这些连接,以供应用程序使用。使用完毕之后,重新把连接放进连接池。
2、常见的数据库连接池竞品有阿里的Druid和Hibernate、Spring使用的c3p0。
3、数据库连接池在整个调用链路中耗时不大,性能关键有两点:
- LRU缓存算法:LRU是Least Recently Used算法。存在一个有限长的链表,新加入的元素放置于表头,命中缓存的元素会移动到表头。表尾移出的元素被废弃。
- PSCache缓存:PrepareStatementCache算法。PremiumStatement创建语句模板需要开销,利用内存将PremiumStatement模板缓存。对应用里的固定反复执行的sql性能大幅优化,但存在内存开销。
4、Druid和c3p0都满足了LRU和PSCache,性能上差距很小。Druid支持负载均衡,在高并发下稍有优势。
5、Druid支持ExceptionSorter:发生服务器宕机、网络抖动使得连接发送不可恢复的中断时,将该条连接从连接池中移出。稳定性保证。
6、Druid支持多种Filter扩展:
- StatFilter:监控组件,可以监控SQL执行次数、并发、慢查、时间分布等常规SQL监控信息。提供Servlet访问查询页面。
- WallFilter:安全组件,防止SQL注入。Druid基于对SQL的语义分析,实现的防止SQL注入。
7、扩展,LRU和LFU。刚刚第三点有提到LRU,是将最近一次命中的缓存放置于列表头部的算法。但是如果某个缓存命中的次数非常多,最近的几次没有命中,就有可能被踢出缓存队列。这个时候LFU算法更加适用。LFU算法:Least Frequently Used算法,在缓存列表满的时候将命中次数最少的缓存踢出队列。本质上是一个TopK的算法。