Hikari 数据源介绍

jimmy・2018 年 09 月 23 日・默认分类

预估

https://izhong.me/index.php/archives/78/

介绍

官网地址: https://github.com/brettwooldridge/HikariCP

快速,简单,可靠的数据源,spring boot2.0 已经将 HikariCP 做为了默认的数据源链接池,在官网测试中秒杀一切其他数据源,比如 commons-dbcp,tomcat,c3po,druid。

基本设计

Hikari 链接池采用了很多优化来提高并发数,可参考这里 
所有数据库链接池都遵守基本的设计规则,实现 javax.sql.DataSource 接口,里面最重要的方法就是 Connection getConnection () throws SQLException; 用于获取一个 Connection, 一个 Connection 就是一个数据库链接,就是一个 TCP 链接,建立 TCP 链接是需要进行 3 次握手的,这降低来链接的使用效率,也是各种数据库链接池存在的原因。

数据库链接池通过事先建立好 Connection 并缓存起来,这样应用需要做数据查询的时候,直接从缓存中拿到 Connection 就可以使用来。数据库链接池还能够检测异常的链接,释放闲置的链接。

HikariDataSource

Hikari 中提供的 DataSource 是 HikariDataSource ,HikariDataSource 实现了 HikariConfig,和数据库的各种参数超时时间配置就正 HikariaConfig 中。

其中提供两种初始化方式,一种是默认的构造函数,单 new 一个 HikariDataSource 时,数据源的链接不会建立,需要等到第一次调用 HikariDataSource 的 getConnection 方法。数据源建立后的相关信息保存在 HikariDataSource 中变量 HikariPool pool。

另一种建立方式是调用带有 HikariConfig 的构造函数,这种方式适合多个数据源的建立,共享同一份配置。 这种方式在调用构造函数的时候就建立了数据源的链接。

HikariDataSource 的所有数据源获取都委托给了 HikariPool,一个数据源会有一个 HikariPool,一个 HikariPool 中有一个 ConcurrentBag,一个 ConcurrentBag 中多个 PoolEntry,一个 PoolEntry 对应一个 Connection。

HikariPool

HikariPool 中的基本 field 介绍。

PoolEntryCreator POOL_ENTRY_CREATOR:用于创建 PoolEntry,也就是用于创建 Connection 了,创建 Connection 是委托给驱动程序的。

Collection<Runnable> addConnectionQueue :就是一个 LinkedBlockingQueue,不过不能修改其中的内容。当正在创建底层 Connection 的时候这个 Queue 会有值。用户后续判断当前线程池里面还是否需要创建新的链接。

ThreadPoolExecutor addConnectionExecutor:创建 Connection 链接的执行是有这个线程池调度的。使用新的链接池不会而不使用当前的工作线程,为了不影响工作线程的执行(比如会导致工作线程超时)。

ThreadPoolExecutor closeConnectionExecutor:关闭 Connection 的链接是有这个线程池调度的。

ConcurrentBag<PoolEntry> connectionBag:这个是最重要的,每次获取 Connection 都是从这里面获取,采用了 ThreadLocal 来减少竞争。

ProxyLeakTaskFactory leakTaskFactory;参考 ProxyLeakTask 用于检测 Connection 泄漏。

ScheduledFuture<?> houseKeeperTask:用于管理链接池里面的链接,比如链接不够用了要创建链接,链接最大生存时间到了要关闭链接。线程池中的 Connection 就是有它初始化的。

ConcurrentBag

最新文章

  1. Node.js的特点
  2. c++11 其他特性(一)
  3. Perl,Python,Ruby,Javascript 四种脚本语言比较
  4. DS1302-演示代码
  5. JFreeChart当鼠标停留在热点提示自定义信息功能
  6. JAVA序列化在IO中读写对象的使用
  7. zzw原创_ipv6下环境配置防火墙及FTP处理一例
  8. jQuery-爱奇艺图片切换
  9. 有时间了解一下Spark SQL parser的解析器架构
  10. linux 服务器安装 nginx
  11. PHP批量保存图片到服务器再上传阿里云
  12. LwIP协议栈接口
  13. Oracle11g em启动报此网站的安全证书有问题的解决方案
  14. qt creator翻译流程
  15. linux搭建smb、挂载smb、Windows共享
  16. BZOJ3230: 相似子串【后缀数组】
  17. Servlet基础笔记
  18. libcurl使用easy模式阻塞卡死等问题的完美解决---超时设置
  19. Error_OAF_the descriptive flexfield with application name payables and name is not frozen
  20. | 与|| ,&amp; 与&amp;&amp;

热门文章

  1. new的原理及实现
  2. 完整且易读的最新版小程序登录态和检验注册过没的app.js写法
  3. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
  4. win10自带截屏操作
  5. Makefile 基础语法
  6. Jupyter Notebook---不需认证,与nginx搭配远程访问及下载
  7. django bms
  8. 201671010402-陈靖 实验十四 团队项目评审&amp;课程学习总结
  9. 朱石景 201671010457 团队项目评审&amp;课程学习总结
  10. Spring AOP技术本质认识