HikariCP Github地址: https://github.com/brettwooldridge/HikariCPcss
HikariCP是数据库链接池,并且是号称史上最快的, SpringBoot2.0也已经采用HikariCP做为默认链接池配置.git
HikariCP为何这么快
1.1 代码量很是小:
要知道对于链接池来说,代码越少,占用cpu和内存越少,Bug出现概率也是越小,那么表明他的执行率高,这就是为何HikariCP受欢迎的缘由之一
1.2 稳定性,可靠性强:
HikariCP是经受了市场的考验,走过太上老君的丹炉,现现在拿到SpringBoot的入场证,走上了人生巅峰.
1.3 速度奇快:
光有健壮性可不行,坦克很健壮,却跑不过飞机,可是HikariCP却依靠本身的代码少,重写数据结构等特色,成功晋级速度最快链接池冠军宝座github
HikariCP快得益于:
1.1 优化并精简字节码 1.2 使用FastList替代ArrayList 1.3 ConcurrentBag:更好的并发集合类实现
链接池的FastList源码:
/** * 没有列表检查的 FastList。 * * @author Brett Wooldridge */ public final class FastList<T> implements List<T>, RandomAccess, Serializable { private static final long serialVersionUID = -4598088075242913858L; private final Class<?> clazz; private T[] elementData; private int size; /** * 构建一个默认大小为32的列表。 * @param clazz the Class stored in the collection */ @SuppressWarnings("unchecked") public FastList(Class<?> clazz) { this.elementData = (T[]) Array.newInstance(clazz, 32); this.clazz = clazz; } /** * 构造具备指定大小的列表。 * @param clazz the Class stored in the collection * @param capacity the initial size of the FastList */ @SuppressWarnings("unchecked") public FastList(Class<?> clazz, int capacity) { this.elementData = (T[]) Array.newInstance(clazz, capacity); this.clazz = clazz; } @Override public boolean add(T element) { //给 list添加属性 //若是 size值小于 初始化的值 if (size < elementData.length) { elementData[size++] = element; } else { // 溢出的代码 //elementData 原始32不够用 须要扩容 final int oldCapacity = elementData.length; final int newCapacity = oldCapacity << 1; @SuppressWarnings("unchecked") //扩容集合 final T[] newElementData = (T[]) Array.newInstance(clazz, newCapacity); //数组复制 System.arraycopy(elementData, 0, newElementData, 0, oldCapacity); //属性赋值 newElementData[size++] = element; elementData = newElementData; } return true; } /* * 我复制ArrayList的get代码 来看看为何 FastList 更快 * public E get(int index) { * rangeCheck(index); * return elementData(index); * } * 多出了rangeCheck 检查角标范围 节省时间 */ @Override public T get(int index) { return elementData[index]; } /* * 这个是ArrayList的 remove()代码 FastList 少了检查范围 和 从头至尾的 检查元素动做 性能更快 * rangeCheck(index); * modCount++; * E oldValue = elementData(index); */ @Override public boolean remove(Object element) { for (int index = size - 1; index >= 0; index--) { if (element == elementData[index]) { final int numMoved = size - index - 1; //若是角标不是最后一个 copy一个新的数组结构 if (numMoved > 0) { System.arraycopy(elementData, index + 1, elementData, index, numMoved); } //若是角标是最后面的 直接初始化为null elementData[--size] = null; return true; } } return false; }
ArrayList不但先进行检查角标范围,并且还从头到脚进行扫描元素,而FastList的get和remove方法摈弃了这一作法。数据库
HikariCP在优化并精简字节码上也下了功夫,使用第三方的Java字节码修改类库Javassist来生成委托实现动态代理.动态代理的实如今ProxyFactory类,速度更快,相比于JDK Proxy生成的字节码更少,精简了不少没必要要的字节码.数组