HikariCP 笔记

优势

  1.HikariCp优化创建了concurrentBag,增加了并发读写的效率,减少了其他没必要的操作,是的集合性能提高了很多。
  2.使用threadlocal缓存连接以及大量使用cas的机制,避免lock.
  3.使用Javassist来实现动态代理类,实现了字节码的优化。
  4.心跳语句由select 1 变成了ping。
  5.大量的方法内联。效率提高了很多。
  6.代码量少。
  7.FastStatementList代替了Arraylist,去掉了调用get时的范围检查,增加性能。

声明定义

  HikariDataSource:数据源,我们通过其对象来获取连接。

  HikariPool:连接池,对资源进行管理。

  ConcurrentBag:作为物理连接的共享资源站。

  PoolEntry:物理连接的封装。

  获取连接流程getConnection:
  1.HikariDataSource对象调用getConnection来获取连接
  2.调用HikariPool的getConnection获取连接。
  3.调用ConcurrentBag取出一个PoolEntry.然后这个PoolEntry通过createProxyConnection掉用工厂类生成HikariProxyConnection返回。

  连接关闭closeConnection():
  closeConnectionExecutor关闭连接后,会调用fillPool()方法对连接池进行连接填充。同时HikariPool提供evictConnection(Connection)方法对物理连接进行手动关闭。
  连接关闭close():
  HikariProxyConnection调用close方法时调用了PooleEntry的recycle方法,之后通过HikariPool调用了ConcurrentBag的requite放回。(poolEntry通过borrow从bag中取出,再通过requite放回。资源成功回收)。

  创建连接createPoolEntry:
  HikariCP中通过独立的线程池addConnectionExecutor进行新连接的生成,连接生成方法为PoolEntryCreator。物理链接的生成只由PoolBase的newConnection()实现,之后封装成PoolEntry,通过Bag的add方法加入ConcurrentBag。当ConcurrentBag存在等待线程,或者有连接被关闭时,会触发IBagItemListener的addBagItem(wait)方法,调用PoolEntryCreator进行新连接的生成。

连接池到底该多大

  2个参数:

  maxPoolSize:最大连接数。

  minIdle:最小连接数。作者建议这个值和maxPoolSize保持一致作为一个固定大小的连接池。

  连接池大家是综合每个应用系统的业务逻辑特性,加上应用硬件配置,加上应用部署数量,再加上db硬件配置和最大允许连接数测试出来的。很难有一个简单公式进行计算。连接数及超时时间设置不正确经常会带来较大的性能问题,并影响整个服务能力的稳定性。具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。压测很重要。

  我们进行判断时,可以从以下几个层面分析:
  系统中多少个线程在进行与数据库有关的工作?多少个线程在等待获取数据库连接?获取数据库连接需要的平均时长是多少?如果平均时长较长,如大于 100ms,则可能说明配置的数据库连接数不足,或存在连接泄漏问题。