出现背景
- 需要数据库连接得到高效、安全的复用,避免数据库连接频繁建立、关闭的开销。
- 对共享资源有一个设计模式(资源池)来解决资源频繁分配、释放造成的问题。把该模式应用到数据库连接管理领域,就是建立数据库连接池。
- 基本原理是在内部对象池维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。
第一代连接池
- 一般采用单线程同步的架构设计的都属于第一代连接池,而采用多线程异步架构的则属于第二代。比较有代表性的就是Apache Commons DBCP。
第二代连接池
- 在数据库连接池产品群,二代对一代的超越是颠覆性,很难找到第二条理由说服自己不选择二代,最具代表性的两款产品是HikariCP和druid。
HikariCP的优化策略
*字节码精简:优化代码直到编译后字节码最少,让CPU缓存可加载更多程序代码;
- 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
- 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要range check,避免调用remove()时的从头到尾的扫描;
- 自定义集合类型(ConcurrentBag):提高并发读写效率;
druid
- druid是阿里一个开源项目,除提供卓越的连接池功能外,还集成sql监控、黑名单拦截等功能,用它自己的话说,druid是“为监控而生”。