调了一波Druid之后,性能上还是上不去,果断的切到了HikariCP上。
经过攻读源码,可知Hikari性能高的主要理由:
1. 精简字节码. javassist
2. concurrentBag 无锁设计,ThreadLocal缓存,队列窃取,直接切换优化
3. FastList get(不range判断), remove(倒序),
4. 整个链路都是无锁化的
按照hikari的定位,调节了maxpool, initpool, autoconnect, xxtimeout等参数后,数据池化暂时正常。。
以下记录下关键链路:
sharedList : CopyOnWriteArrayList<T> 公共连接list
handoffQueue : SynchronousQueue<T> 回收等待list
所有入口最终都会到这里:java.util.concurrent.SynchronousQueue.TransferQueue#transfer (最变态的这里)
addConnectionQueue
PoolEntryCreator.call() -- 创建线程到池
connectionBag.add(poolEntry);
com.zaxxer.hikari.util.ConcurrentBag#add // Add a new object to the bag for others to borrow.
com.zaxxer.hikari.pool.HikariPool.PoolEntryCreator#shouldCreateAnotherConnection
// 这里等待较长
final T bagEntry = handoffQueue.poll(timeout, NANOSECONDS);
TransferQueue.poll()
TransferQueue.transfer()
而通过prometheus监控Hikari的指标是最事半功倍的(Hikari实现了相关prome的拉取api,集成metric就可以):