DBCP、Druid、HikariCP
1. DBCP
apache上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
commons-pool对象池机制的数据库连接池。
对象池:
-
对象池:就是我们要介绍的commons-pool的核心概念,类似于容器,用于存放我们需要池化的对象。
-
对象池工厂:就是操作对象池的工程(类似于设计模式中的工程模式),这个工厂可以执行借出、归还、销毁等管理池对象的操作。
-
池对象:就是我们需要池化的对象。
-
池对象工厂:就是操作池对象的工厂,比如生成、验证、激活、钝化、销毁池对象。
public interface ObjectPool {
//从对象池中借出对象
public abstract Object borrowObject() throws Exception,NoSuchElementException, IllegalStateException;
//将对象归还到对象池中
public abstract void returnObject(Object obj) throws Exception;
//使一个对象无效
public abstract void invalidateObject(Object obj) throws Exception;
//向对象池中添加对象
public abstract void addObject() throws Exception, IllegalStateException,UnsupportedOperationException;
//得到当前对象池中空闲的对象
public abstract int getNumIdle() throws UnsupportedOperationException;
//得到当前对象池已经借出的对象,这里的激活其实就是对象池借出对象的概念
public abstract int getNumActive() throws UnsupportedOperationException;
//清空对象池,并销毁对象池中的所有对象
public abstract void clear() throws Exception,UnsupportedOperationException;
// 关闭对象池
public abstract void close() throws Exception;
/**
* @deprecated Method setFactory is deprecated
*这个方法已经弃用了,池对象工程需要在实现类的构造函数中传入
*/
public abstract void setFactory(PoolableObjectFactory poolableobjectfactory)
throws IllegalStateException, UnsupportedOperationException;
}
2. Druid
是alibba出品的一个功能比较全面,且扩展性较好的数据库连接池,比较方便对jdbc接口进行监控跟踪等。
- DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。
- DruidDataSource 高效可管理的数据库连接池。
- SQLParser。
1) 可以监控数据库访问性能
Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
2) 替换DBCP和C3P0。
Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
3) 数据库密码加密
直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
4) SQL执行日志
Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
注: 可能会有连接泄露问题
连接泄露
指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。
3. HikariCP
目前最快,目前被SpringBoot2官方推荐使用的数据库连接池。
- 字节码更加精简,所以可以加载更多代码到缓存。
- 实现了一个无锁的集合类型,来减少并发造成的资源竞争。
- 使用了自定义的数组类型,相对与ArrayList极大地提升了性能。
- 针对CPU的时间片算法进行优化,尽可能在一个时间片里面完成各种操作。