Spring Boot如何使用HikariCP连接池详解

前言

Springboot让Java开发更加美好,更加简洁,更加简单。Spring Boot 2.x中使用HikariCP作为默认的数据连接池。 HikariCP使用Javassist字节码操作库来实现动态代理,优化并精简了字节码,同时内部使用 com.zaxxer.hikari.util.FastList 代替ArrayList、使用了更好的并发集合类 com.zaxxer.hikari.util.ConcurrentBag ,“号称”是目前最快的数据库连接池。

下面话不多说了,来一起看看详细的介绍吧

基本使用

在Spring Boot 2.x中使用HikariCP十分简单,只需引入依赖 implementation 'org.springframework.boot:spring-boot-starter-jdbc'

pluginManagement {
	repositories {
		gradlePluginPortal()
	}
}
rootProject.name = 'datasource-config'

plugins {
	id 'org.springframework.boot' version '2.1.3.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'spring-boot-guides'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

配置文件如下:

spring:
 datasource:
 url: jdbc:h2:mem:demodb
 username: sa
 password:
 hikari: # https://github.com/brettwooldridge/HikariCP (uses milliseconds for all time values)
 maximumPoolSize: 10
 minimumIdle: 2
 idleTimeout: 600000
 connectionTimeout: 30000
 maxLifetime: 1800000

关于连接池的具体配置参数详见 HikariCP

示例代码如下:

package springbootguides.datasourceconfig;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.sql.DataSource;
import java.sql.Connection;

@SpringBootApplication
public class DatasourceConfigApplication implements CommandLineRunner {

	@Autowired
	private DataSource datasource;

	@Override
	public void run(String... args) throws Exception {
		try(Connection conn = datasource.getConnection()) {
			System.out.println(conn);
		}
	}

	public static void main(String[] args) {
		SpringApplication.run(DatasourceConfigApplication.class, args);
	}

}

实现原理

Spring Boot使用如下方式整合HikariCP:入口是 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration ,通过 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Hikari 中的 @Bean 方式创建 com.zaxxer.hikari.HikariDataSource

/**
	 * Hikari DataSource configuration.
	 */
	@ConditionalOnClass(HikariDataSource.class)
	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)
	static class Hikari {

		@Bean
		@ConfigurationProperties(prefix = "spring.datasource.hikari")
		public HikariDataSource dataSource(DataSourceProperties properties) {
			HikariDataSource dataSource = createDataSource(properties,
					HikariDataSource.class);
			if (StringUtils.hasText(properties.getName())) {
				dataSource.setPoolName(properties.getName());
			}
			return dataSource;
		}

	}

@ConfigurationProperties(prefix = "spring.datasource.hikari") 会自动把 spring.datasource.hikari.* 相关的连接池配置信息注入到创建的HikariDataSource实例中。

HikariCP的监控和遥测

因为在我们的微服务体系中使用的监控系统是Prometheus,这里以Prometheus为例。

注意spring boot 2.0对spring boot 1.x的metrics进行了重构,不再向后兼容,主要是在spring-boot-acutator中使用了micrometer,支持了更多的监控系统:Atlas、Datadog、Ganglia、Graphite、Influx、JMX、NewRelic、Prometheus、SignalFx、StatsD、Wavefront。Spring boot 2.0的metrics对比spring boot 1.x除了引入micrometer外,更大的体现是支持了tag,这也说明Prometheus、Influx等支持Tag的时序监控数据模型的监控系统已经成为主流。

在前面示例中的build.gradle中加入如下依赖:

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'

配置文件applycation.yaml中加入对actuator的配置:

management:
 endpoints:
 web:
  exposure:
  include: "health,info,prometheus"
 server:
 port: 8079
 servlet:
  context-path: /

注意这里引入了web和actuator依赖,通过配置 management.server.port 指定actuator的web端点为8089端口,通过 management.endpoints.include 对外开放 /actuator/prometheus ,在引入 io.micrometer:micrometer-registry-prometheus 依赖之后,端点 /actuator/prometheus 当即生效。

curl http://localhost:8079/actuator/prometheus | grep hikari
# TYPE hikaricp_connections_acquire_seconds summary
hikaricp_connections_acquire_seconds_count{pool="HikariPool-1",} 3.0
hikaricp_connections_acquire_seconds_sum{pool="HikariPool-1",} 0.001230082
# HELP hikaricp_connections_acquire_seconds_max Connection acquire time
# TYPE hikaricp_connections_acquire_seconds_max gauge
hikaricp_connections_acquire_seconds_max{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_min Min connections
# TYPE hikaricp_connections_min gauge
hikaricp_connections_min{pool="HikariPool-1",} 2.0
# TYPE hikaricp_connections_timeout_total counter
hikaricp_connections_timeout_total{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_pending Pending threads
# TYPE hikaricp_connections_pending gauge
hikaricp_connections_pending{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_usage_seconds Connection usage time
# TYPE hikaricp_connections_usage_seconds summary
hikaricp_connections_usage_seconds_count{pool="HikariPool-1",} 3.0
hikaricp_connections_usage_seconds_sum{pool="HikariPool-1",} 0.06
# HELP hikaricp_connections_usage_seconds_max Connection usage time
# TYPE hikaricp_connections_usage_seconds_max gauge
hikaricp_connections_usage_seconds_max{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_max Max connections
# TYPE hikaricp_connections_max gauge
hikaricp_connections_max{pool="HikariPool-1",} 10.0
# HELP hikaricp_connections Total connections
# TYPE hikaricp_connections gauge
hikaricp_connections{pool="HikariPool-1",} 2.0
# HELP hikaricp_connections_creation_seconds_max Connection creation time
# TYPE hikaricp_connections_creation_seconds_max gauge
hikaricp_connections_creation_seconds_max{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_creation_seconds Connection creation time
# TYPE hikaricp_connections_creation_seconds summary
hikaricp_connections_creation_seconds_count{pool="HikariPool-1",} 1.0
hikaricp_connections_creation_seconds_sum{pool="HikariPool-1",} 0.001
# HELP hikaricp_connections_idle Idle connections
# TYPE hikaricp_connections_idle gauge
hikaricp_connections_idle{pool="HikariPool-1",} 2.0
# HELP hikaricp_connections_active Active connections
# TYPE hikaricp_connections_active gauge
hikaricp_connections_active{pool="HikariPool-1",} 0.0

参考

HikariCP

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解Spring Boot微服务如何集成fescar解决分布式事务问题

    什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最后释放全局锁.锁持有的时间较长,会对并发造成较大的影响,死锁的风险也较高. fescar的创新之处在于,每个局部事务执行完立即提交,释放本地锁:它会去解析你代码中的sql,从数据库中获得事务提交前的事务资源即数据,存放到undo_log中,全局事务协调器在回滚的时候直接使用undo_log中的数据覆

  • SpringBoot使用编程方式配置DataSource的方法

    Spring Boot使用固定算法来扫描和配置DataSource.这使我们可以在默认情况下轻松获得完全配置的DataSource实现. Spring Boot还会按顺序快速的自动配置连接池(HikariCP, Apache Tomcat或Commons DBCP),具体取决于路径中的哪些类. 虽然Spring Boot的DataSource自动配置在大多数情况下运行良好,但有时我们需要更高级别的控制,因此我们必须设置自己的DataSource实现,因此忽略自动配置过程. Maven依赖 总体而

  • spring boot 自定义规则访问获取内部或者外部静态资源图片的方法

    项目中需要将图片放在磁盘上,不能将图片放在webapp下面! springboot默认配置基本上可以满足我们的日常需要.但是项目中大量用户上传的图片,不能放在tomcat下面,这样子每次重新部署项目的时候,图片就失效了,很是麻烦. 所以此时就需要自定义配置springboot的项目静态文件映射 springboot默认的配置规则 映射 /** 到 classpath:/static classpath:/public classpath:/resources classpath:/META-IN

  • SpringBoot MockMvc单元测试的示例代码

    为何使用MockMvc? 对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入了MockMVC. MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快.不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而

  • Linux编辑启动、停止与重启springboot jar包脚本实例

    前言 springboot的配置文件中,配置文件的名字都有各自的意义跟用途 dev 开发环境 prod 生产环境(默认) test 测试环境 加载指定配置文件 --spring.profiles.active=prod springboot加载jar包的方式有 // 直接在控制台进行启动,缺点就是控制台关闭项目也就关闭了. java -jar bootdo.jar // 这种方式可以运行在后台,但是如果推出了shell的话,那也会挂 java -jar /bootdo-2.0.0.jar > b

  • spring-mvc/springboot使用MockMvc对controller进行测试

    网上基本都是参考官方的使用方式,使用了import static,个人感觉这种方式特别不好,代码提示性不友好.所以在此进行说明,也方便自己以后使用. 1. 引入spring-test相关jar包,springboot只需引入spring-boot-starter-test即可 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tes

  • 基于MockMvc进行springboot调试(SpringbootTest)

    这篇文章主要介绍了基于MockMvc进行springboot调试(SpringbootTest),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 测试前关闭web项目.springboot启动程序WebApplication.class 笔者本地自定了端口SpringBootTest.WebEnvironment.DEFINED_PORT 代码如下: import com.netmarch.web.WebApplication; import o

  • SpringBoot+Spring Security+JWT实现RESTful Api权限控制的方法

    摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能够访问API. 一:开发一个简单的API 在IDEA开发工具中新建一个maven工程,添加对应的依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

  • Spring Boot如何使用HikariCP连接池详解

    前言 Springboot让Java开发更加美好,更加简洁,更加简单.Spring Boot 2.x中使用HikariCP作为默认的数据连接池. HikariCP使用Javassist字节码操作库来实现动态代理,优化并精简了字节码,同时内部使用 com.zaxxer.hikari.util.FastList 代替ArrayList.使用了更好的并发集合类 com.zaxxer.hikari.util.ConcurrentBag ,"号称"是目前最快的数据库连接池. 下面话不多说了,来一

  • SpringBoot HikariCP连接池详解

    目录 背景 公用池化包 Commons Pool 2 案例 JMH 测试 数据库连接池 HikariCP 结果缓存池 小结 背景 在我们平常的编码中,通常会将一些对象保存起来,这主要考虑的是对象的创建成本. 比如像线程资源.数据库连接资源或者 TCP 连接等,这类对象的初始化通常要花费比较长的时间,如果频繁地申请和销毁,就会耗费大量的系统资源,造成不必要的性能损失. 并且这些对象都有一个显著的特征,就是通过轻量级的重置工作,可以循环.重复地使用. 这个时候,我们就可以使用一个虚拟的池子,将这些资

  • Spring Boot实现数据访问计数器方案详解

    目录 1.数据访问计数器 2.代码实现 2.1.方案说明 2.2.代码 2.3.调用 1.数据访问计数器   在Spring Boot项目中,有时需要数据访问计数器.大致有下列三种情形: 1)纯计数:如登录的密码错误计数,超过门限N次,则表示计数器满,此时可进行下一步处理,如锁定该账户. 2)时间滑动窗口:设窗口宽度为T,如果窗口中尾帧时间与首帧时间差大于T,则表示计数器满.   例如使用redis缓存时,使用key查询redis中数据,如果有此key数据,则返回对象数据:如无此key数据,则查

  • Spring Boot 控制层之参数传递方法详解

    当然,您自己创建一个项目也是可以的. bean包下的Student.java package com.example.demo.bean; public class Student { private Integer id; //学号 private String name; //姓名 public Student() { } public Student(Integer id, String name) { this.id = id; this.name = name; } public In

  • Spring事务管理中关于数据库连接池详解

    目录 Spring事务管理 环境搭建 标准配置 声明式事务 总结 SqlSessionFactory XML中构建SqlSessionFactory 获得SqlSession的实例 代码实现 作用域(Scope)和生命周期 SqlSessionFactoryBuilder(构造器) SqlSessionFactory(工厂) SqlSession(会话) Spring事务管理 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序

  • spring boot中的properties参数配置详解

    application.properties application.properties是spring boot默认的配置文件,spring boot默认会在以下两个路径搜索并加载这个文件 src\main\resources src\main\resources\config 配置系统参数 在application.properties中可配置一些系统参数,spring boot会自动加载这个参数到相应的功能,如下 #端口,默认为8080 server.port=80 #访问路径,默认为/

  • spring boot application properties配置实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # ========

  • spring boot微服务自定义starter原理详解

    这篇文章主要介绍了spring boot微服务自定义starter原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用spring boot开发微服务后,工程的数量大大增加(一定要按照领域来切,不要一个中间件客户端包一个),让各个jar从开发和运行时自包含成了一个重要的内容之一.spring boot starter就可以用来解决该问题(没事启动时别依赖于applicationContext.getBean获取bean进行处理,依赖关系

  • Spring Boot读取resources目录文件方法详解

    这篇文章主要介绍了Spring Boot读取resources目录文件方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的src/main/resources下,因此,合同协议PDF模板.Excel格式的统计报表等模板的存放位置是resources/template/test.pdf,下面提供两种读取方式,它们分别在windows和Linux

  • 构建高效的python requests长连接池详解

    前文: 最近在搞全网的CDN刷新系统,在性能调优时遇到了requests长连接的一个问题,以前关注过长连接太多造成浪费的问题,但因为系统都是分布式扩展的,针对这种各别问题就懒得改动了. 现在开发的缓存刷新系统,对于性能还是有些敏感的,我后面会给出最优的http长连接池构建方式. 老生常谈: python下的httpclient库哪个最好用? 我想大多数人还是会选择requests库的.原因么?也就是简单,易用! 如何蛋疼的构建reqeusts的短连接请求: python requests库默认就

随机推荐