专栏首页全栈技术Kojojava应用最好的数据源 Hikari?

java应用最好的数据源 Hikari?

开始正文:

java web 数据源有很多,大家先简单了解一下吧

1、DBCP

DBCP是Apache推出的数据库连接池(Database Connection Pool)。

操作步骤:

添加jar包:

commons-dbcp-1.4.jar

commons-pool-1.5.6.jar

添加属性资源文件

dbcpconfig.properties文件并修改配置。

2、C3P0

操作步骤:

添加jar包

c3p0-0.9.1.2.jar

编写配置文件

创建一个c3p0-config.xml文件

3、JavaWeb之Tomcat管理数据源

上面2中方式都需要导入jar包,在JavaWeb服务器Tomcat中其实内置了数据源。所以不需要导入jar包。

Tomcat内置数据源其实也是DBCP,是Tomcat的lib目录下的tomcat-dbcp.jar。

配置数据源的步骤:

拷贝数据库连接的jar mysql-connector-java-5.1.7-bin.jar到tomcat/lib目录下

配置数据源XML文件

4、BoneCP

bonecp 号称比c3p0 dbcp 性能快25倍,主要是因为 bonecp采用了1.5引入的并行包,抛弃了锁机制

(官方主页)[http://jolbox.com/index.html?page=http://jolbox.com/download.html]

这里提供的maven的依赖 ,另为例子用了单机数据库hsqldb ,所以还需要你导入这个包,不过你可以

用本机的任意一款驱动尝试链接,方式与原始的jdbc连接方式是相同的.

这里有一篇的很全面的参数解释:

(链接)[http://chirs1012f.iteye.com/blog/805261]

5、还是来说说spring boot2.0 的 Hikari

介绍

官网地址: 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

ConcurrentBag 设计主要为了解决并发对资源的争用,其中主要有 CopyOnWriteArrayList<T> sharedList 和 ThreadLocal<List<Object>> threadList,SynchronousQueue<T> handoffQueue,当一个线程获取链接的时候首先从自己的 ThreadLocal 中的 threadList 获取,当获取失败的时候才从 sharedList 获取,当从 sharedList 获取还是失败的话,就等待在 handoffQueue,这是一个同步的 Queue,当其他线程释放链接的时候,自己就会被唤醒。

当然 springboot 2.0 默认连接池就是Hikari了,所以引用parents后不用专门加依赖

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何写出无法维护的代码

    单字母的变量名。比如:a,b,c, x,y,z(如果不够用,可以考虑a1,a2,a3,a4,….)

    冯杰宁
  • vue 工作中用到一些小技巧

    vm.$watch( expOrFn, callback, [options] )

    冯杰宁
  • 优化springboot

    原文地址:https://www.cnblogs.com/superfj/p/8667977.html

    冯杰宁
  • 条码打印软件中一个对象如何连接多个数据源

    有时用条码打印软件制作标签或者条码二维码的时候,需要在一个条形码或者文本对象连接两个数据源甚至多个数据源的数据,实现这种功能在条码打印软件中也是非常简单的,接下...

    中琅软件
  • 动态图表7|组合框(index函数)

    今天跟大家分享动态图表7——组合框(index函数)! 组合框制作图表,其步骤与列表框相同,唯一的不同点在于,组合框控件,提供用于选择的下拉菜单,在未选择的情况...

    数据小磨坊
  • 初识API网关 / API Gateway

    在日常工作中,不同的场合下,我们可能听说过很多次网关这个名称,这里说的网关特指API网关(API Gataway)。字面意思是指将所有API的调用统一接入API...

    RelaxHeart网
  • PowerBI通过gateway连接多维数据库

    简介 Microsoft Power BI 是由微软推出的商业智能的专业分析工具,给用户提供简单且丰富的数据可视化及分析功能。个人非常喜欢,有免费版和Pro的...

    用户1217611
  • springboot实现读写分离(基于Mybatis,mysql)

    近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离。这里用博客记录下过程,一方面可备日后查看,同时也能分享给大家(网上的资料真的大都是抄来抄去,,还不...

    用户2038589
  • 动态图表8|组合框(offset函数)

    今天跟大家分享动态图表8——组合框(offset函数)! 步骤: 使用组合框制作下拉菜单 使用offset函数制作动态数据源 利用动态数据源制作图表 1、组合框...

    数据小磨坊
  • springmvc 拦截器、国际化、验证

    springmvc 拦截器 继承了HandlerIntercepter的类可以作为拦截器类: package com.yawn.intercepter; im...

    yawn

扫码关注云+社区

领取腾讯云代金券