Spring Boot中配置默认的HikariCP数据源

2023-10-30 17:36

本文主要是介绍Spring Boot中配置默认的HikariCP数据源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在了解HiKari之前,我们需要先了解关于数据访问的相关概念:

什么是JDBC

JDBC(Java Database Connectivity)是Java编程语言用于与数据库进行交互的标准API。它提供了一组类和接口,用于执行数据库操作,如连接到数据库、执行SQL语句、处理查询结果等。

JDBC允许开发人员使用Java代码与不同的关系型数据库进行通信,无论是MySQL、Oracle、SQL Server还是其他支持JDBC的数据库系统。

通过JDBC,开发人员可以使用标准的Java语法和面向对象的方式来执行数据库操作。它提供了一种独立于特定数据库的通用方式来访问和操作数据库,使得应用程序可以轻松地切换和兼容不同的数据库系统。

JDBC的核心组件包括DriverManager、Connection、Statement和ResultSet等。
DriverManager用于管理数据库驱动程序,Connection用于建立与数据库的连接,Statement用于执行SQL语句,ResultSet用于处理查询结果。

通过JDBC,开发人员可以使用Java语言编写数据库应用程序,执行各种数据库操作,如插入、更新、删除数据,以及查询和处理查询结果。这使得开发人员能够轻松地将数据库集成到他们的应用程序中,并与数据库进行交互。

什么是数据源

数据源(Data Source)是指数据库或其他数据存储系统的物理或逻辑位置,它提供了访问和操作数据的接口。数据源可以是关系型数据库、文件系统、内存数据库、消息队列等。

在软件开发中,数据源通常用于连接和管理数据存储系统,并提供数据的读取、写入和查询功能。它是应用程序与数据存储系统之间的中间层,隐藏了底层数据存储系统的细节,使得应用程序可以以统一的方式访问不同类型的数据。

使用数据源可以提供以下好处:

  1. 抽象化:数据源提供了一个抽象层,使得应用程序可以以统一的方式访问各种数据存储系统,无需关心底层细节。

  2. 连接管理:数据源负责管理与数据存储系统之间的连接,包括连接的创建、释放和连接池管理,提供了高效的连接管理机制。

  3. 事务管理:数据源可以支持事务管理,确保数据操作的一致性和完整性

  4. 查询优化:数据源可以对查询进行优化,提供更高效的数据访问和查询性能。

在Java中,常见的数据源包括JDBC数据源、连接池数据源(如HikariCP、Apache Commons DBCP)、JNDI数据源等。这些数据源可以通过配置文件或代码来配置和使用,以便应用程序可以连接和操作数据库。

HikariCP

HikariCP是一个高性能的JDBC(Java数据库连接)连接池库,用于管理数据库连接的分配和释放。它旨在提供快速、轻量级和可伸缩的数据库连接池,特别适用于Java应用程序,如Spring Boot应用程序。

HikariCP的主要特点包括:

  1. 高性能: HikariCP的设计目标之一是提供卓越的性能。它通过减少连接池本身的开销、优化线程池的管理以及有效地处理数据库连接的分配和释放来实现高性能。
  2. 轻量级: HikariCP是一个轻量级的库,它的jar文件非常小,不会占用太多内存。这对于资源受限的应用程序来说是一个重要的优势。
  3. 自动管理连接: HikariCP能够自动管理数据库连接,包括连接的创建、验证、分配和释放。它可以有效地处理连接的闲置和超时,以确保连接池中始终有可用的连接。
  4. 配置灵活: HikariCP允许你通过配置属性来调整连接池的行为,以满足不同应用程序的需求。你可以轻松地配置连接超时、最大连接数、最小空闲连接数等参数。
  5. 支持监控: HikariCP提供了监控连接池的功能,可以用于跟踪连接池的性能和状态。这对于应用程序的性能分析和故障排查非常有用。

HikariCP在Java生态系统中得到广泛使用,特别是在Spring Boot应用程序中,因为它与Spring Boot集成得很好,并且能够提供可靠的数据库连接池管理。通过使用HikariCP,你可以更好地管理和优化数据库连接,从而提高应用程序的性能和可伸缩性。

在Spring Boot中配置默认数据源HikariCp

在Spring Boot自动化配置中,对于数据源的配置可以分为两类:

通用配置:以spring.datasource.*的形式存在,主要是对一些即使使用不同数据源也都需要配置的一些常规内容。比如:数据库链接地址、用户名、密码等。这里就不做过多说明了,通常就这些配置:

# MySQL
#spring.datasource.url=jdbc:mysql://localhost:3306/test
#spring.datasource.username=root
#spring.datasource.password=
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# Oracle
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

数据源连接池配置:以spring.datasource.<数据源名称>.*的形式存在,比如:Hikari的配置参数就是spring.datasource.hikari.*形式。下面这个是我们最常用的几个配置项及对应说明:

# 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=10
# 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=20
# 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
spring.datasource.hikari.idle-timeout=500000
# 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.max-lifetime=540000
# 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
spring.datasource.hikari.connection-timeout=60000
# 用于测试连接是否可用的查询语句
spring.datasource.hikari.connection-test-query=SELECT 1 from useradd

更多相关配置请参照
spring.datasource.hikari.connectionTimeout: 连接超时时间(毫秒)。连接池在尝试获取连接时等待的最长时间。

spring.datasource.hikari.maximumPoolSize: 连接池的最大连接数。连接池将尝试维护的最大活动连接数。

spring.datasource.hikari.minimumIdle: 连接池的最小空闲连接数。连接池会尝试保持的最小空闲连接数。

spring.datasource.hikari.idleTimeout: 连接的最大空闲时间(毫秒)。超过此时间的空闲连接将被关闭并从池中删除。

spring.datasource.hikari.maxLifetime: 连接的最大生存时间(毫秒)。连接在连接池中的最长寿命。一旦达到此时间,连接将被关闭并从池中删除。

spring.datasource.hikari.connectionTestQuery: 用于测试连接的SQL查询语句。当从连接池中获取连接时,连接池将执行此查询以确保连接的有效性。

spring.datasource.hikari.poolName: 连接池的名称。用于标识连接池的名称。

spring.datasource.hikari.dataSourceClassName: 数据源的完整类名。用于指定JDBC驱动程序的类。

spring.datasource.hikari.username: 数据库用户名。

spring.datasource.hikari.password: 数据库密码。

spring.datasource.hikari.autoCommit: 是否自动提交事务,默认为true。

spring.datasource.hikari.transactionIsolation: 数据库连接的事务隔离级别。可以设置为 “DEFAULT”、“TRANSACTION_READ_UNCOMMITTED”、“TRANSACTION_READ_COMMITTED”、“TRANSACTION_REPEATABLE_READ”、“TRANSACTION_SERIALIZABLE” 等值。

spring.datasource.hikari.initializationFailTimeout: 连接池初始化失败时的超时时间(毫秒)。如果连接池初始化失败,将等待此时间。

spring.datasource.hikari.isolateInternalQueries: 是否隔离内部查询。默认为false。

spring.datasource.hikari.allowPoolSuspension: 是否允许连接池暂停。默认为false。

这些配置项可以在application.properties或application.yml文件中进行设置,根据你的应用程序的需求,可以调整这些配置项以获得最佳性能和可靠性。

demo

给出我在测试阶段的相关代码:
第一步在Spring Boot中引入相关依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.oracle.ojdbc</groupId><artifactId>ojdbc8</artifactId><version>19.3.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

第二步,在application.properties配置相关依赖:

#spring.datasource.url=jdbc:mysql://localhost:3306/test
#spring.datasource.username=root
#spring.datasource.password=
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver# 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=10
# 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=20
# 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
spring.datasource.hikari.idle-timeout=500000
# 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.max-lifetime=540000
# 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
spring.datasource.hikari.connection-timeout=60000
# 用于测试连接是否可用的查询语句
spring.datasource.hikari.connection-test-query=SELECT 1 from useradd

第三步,设计数据库:
PS: 我采用的是Oracle 数据库,语法与MySQL有所差别

CREATE TABLE useradd (name varchar2 (100) NOT NULL,age integer NOT NULL
)

第四步,创建对应的实体类对象:

public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public User(String name, Integer age) {this.name = name;this.age = age;}public User() {}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return name.equals(user.name) && age.equals(user.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

第五步,设计相关接口信息:

public interface UserService {/*** 新增一个用户** @param name* @param age*/int create(String name, Integer age);/*** 根据name查询用户** @param name* @return*/List<User> getByName(String name);/*** 根据name删除用户** @param name*/int deleteByName(String name);/*** 获取用户总量*/int getAllUsers();/*** 删除所有用户*/int deleteAllUsers();}

第六步,设计接口实现类:

@Service
public class UserServiceImpl implements UserService {private JdbcTemplate jdbcTemplate;UserServiceImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic int create(String name, Integer age) {return jdbcTemplate.update("insert into USERADD(NAME, AGE) values(?, ?)", name, age);}@Overridepublic List<User> getByName(String name) {List<User> users = jdbcTemplate.query("select NAME, AGE from USERADD where NAME = ?", (resultSet, i) -> {User user = new User();user.setName(resultSet.getString("NAME"));user.setAge(resultSet.getInt("AGE"));return user;}, name);return users;}@Overridepublic int deleteByName(String name) {return jdbcTemplate.update("delete from USERADD where NAME = ?", name);}@Overridepublic int getAllUsers() {return jdbcTemplate.queryForObject("select count(1) from USERADD", Integer.class);}@Overridepublic int deleteAllUsers() {return jdbcTemplate.update("delete from USERADD");}}

第七步,我们通过设计单元测试进行测试:

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter32ApplicationTests {@Autowiredprivate UserService userSerivce;@Autowiredprivate DataSource dataSource;@Beforepublic void setUp() {// 准备,清空user表userSerivce.deleteAllUsers();}@Testpublic void test() throws Exception {// 插入5个用户userSerivce.create("Tom", 10);userSerivce.create("Mike", 11);userSerivce.create("Didispace", 30);userSerivce.create("Oscar", 21);userSerivce.create("Linda", 17);// 查询名为Oscar的用户,判断年龄是否匹配List<User> userList = userSerivce.getByName("Oscar");Assert.assertEquals(21, userList.get(0).getAge().intValue());// 查数据库,应该有5个用户Assert.assertEquals(5, userSerivce.getAllUsers());// 删除两个用户userSerivce.deleteByName("Tom");userSerivce.deleteByName("Mike");// 查数据库,应该有5个用户Assert.assertEquals(3, userSerivce.getAllUsers());}}

file

这篇关于Spring Boot中配置默认的HikariCP数据源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309523

相关文章

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

《SpringBoot拦截器Interceptor与过滤器Filter详细教程(示例详解)》本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程1. 概述1

SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题

《SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题》dynamic-datasource-spring-boot-starter是一... 目录概要整体架构构想操作步骤创建数据源切换数据源后续问题小结概要自己闲暇时间想实现一个多租户平台,

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使