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

[转帖]Hikari 数据源介绍的更多相关文章

  1. [转帖]Mysql binlog 介绍

    binlog介绍   1.什么是binlog binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等 ...

  2. CubieBoard开发板数据源介绍

    1: Linaro/Ubuntu Linaro is a not-for-profit engineering organization consolidating and optimizing op ...

  3. DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池

    DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池 liuyuhang原创,未经允许禁止转载  系列目录连接 DB数据源之SpringBoot+Mybatis踏坑 ...

  4. Spring Boot HikariCP 一 ——集成多数据源

    其实这里介绍的东西主要是参考的另外一篇文章,数据库读写分离的. 参考文章就把链接贴出来,里面有那位的代码,简单明了https://gitee.com/comven/dynamic-datasource ...

  5. spring boot(12)-数据源配置原理

    本篇讲的不仅是数据源配置,这也是spring boot实现自动配置的一部分.要理解数据源的配置原理,首先要理解第十篇tomcat连接池的配置 数据源配置源码 这里截取org.springframewo ...

  6. Spring Boot (14) 数据源配置原理

    数据源配置源码 这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,主要介绍Tomcat和Hika ...

  7. Java架构师方案—多数据源开发详解及原理(二)(附完整项目代码)

    1. mybatis下数据源开发工作 2. 数据源与DAO的关系原理模型 3. 为什么要配置SqlSessionTemplate类的bean 4. 多数据源应用测试 1. mybatis下数据源开发工 ...

  8. SpringBoot | 3.1 配置数据源

    目录 前言 1. 数据源的自动配置 2. *数据源自动配置源码分析 2.1 DataSourceAutoConfiguration:数据源自动配置类 2.2 JdbcTemplateAutoConfi ...

  9. 01_数据库连接池,数据源,ResultSetMetaData,jdbc优化

     一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每 ...

随机推荐

  1. 2019CISCN web题赛-JustSoSo;love_math(复现)

    0x00前言 这几天从网上找个CMS源码开始练习审计,盯着众多的代码debug调呀调头晕脑胀的,还不错找到个文件读取和一个ssrf... 上月底结束的CISCN线上赛,web四道,仔细研究的2道,做出 ...

  2. android studio学习----通过libs来导入jar包

    百度经验有一种方法: 1 点击启动AndroidStudio,启动后的界面如图所示. 2 复制你需要添加的jar,并将其黏贴到app— —src— —main— —libs文件夹下,可运行的Andro ...

  3. Conv2D

    Conv2D keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data ...

  4. nginx 日志问题(\x22)

    nginx 日志问题(\x22) 问题: 1.request_body中含有中文时,nginx日志会转换为十六进制. 2.nginx记录问题 POST /xxxxx HTTP/1.1|200|4266 ...

  5. system.exit(int status)中status值不同时的区别

    status为0时为正常退出程序,也就是结束当前正在运行中的java虚拟机. status为非0的其他整数(包括负数,一般是1或者-1),表示非正常退出当前程序. 可以明确的是,无论status是什么 ...

  6. C++负数类型转换,-1对256取模

    最近在读C++ primer的时候,发现p32上写道:当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数.因此,把-1赋值给8比特大小的unsigned c ...

  7. Android程序员事件分发机制学习笔记

    通过问题来学习一个东西是很好的方法.学习Android中View的事件体系,我也通过给自己提问题,在解决问题的同时也就知道了其中原理. 首先来几个问题起步: 什么是事件?什么是事件分发机制? 在我们通 ...

  8. flask实战-个人博客-编写博客前台

    编写博客前台 博客前台需要开放给所有用户,这里包括显示文章列表.博客信息.文章内容和评论等功能功能. 分页显示文章列表 为了在主页显示文章列表,我们要先在渲染主页模板的index视图的数据库中获取所有 ...

  9. Eslint 允许使用双等号

    资料 网址 ESlint: Expected !== and instead saw != https://stackoverflow.com/questions/48375316/eslint-ex ...

  10. 17-C#笔记-类

    1. 构造函数.析构函数 修饰词的作用域仅一行. 类的默认访问标识符是 internal,成员的默认访问标识符是 private. using System; namespace LineApplic ...