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.Driver


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

# 最小空闲连接,默认值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() {
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public 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);
    }

    @Override
    public 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;
    }

    @Override
    public int create(String name, Integer age) {
        return jdbcTemplate.update("insert into USERADD(NAME, AGE) values(?, ?)", name, age);
    }

    @Override
    public 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;
    }

    @Override
    public int deleteByName(String name) {
        return jdbcTemplate.update("delete from USERADD where NAME = ?", name);
    }

    @Override
    public int getAllUsers() {
        return jdbcTemplate.queryForObject("select count(1) from USERADD", Integer.class);
    }

    @Override
    public int deleteAllUsers() {
        return jdbcTemplate.update("delete from USERADD");
    }

}

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

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter32ApplicationTests {

    @Autowired
    private UserService userSerivce;

    @Autowired
    private DataSource dataSource;

    @Before
    public void setUp() {
        // 准备,清空user表
        userSerivce.deleteAllUsers();

    }

    @Test
    public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/109621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM虚拟机:从结构到指令让你对栈有足够的认识

本文重点 在前面的课程中,我们学习了运行时数据区的大概情况,从本文开始,我们将对一些组件进行详细的介绍,本文我们将学习栈。栈内存主管java的运行,是在线程创建时创建的,它是线程私有的,它的生命周期是跟随线程的生命期,也就是说线程结束栈内存就释放了,对于栈来说…

Elasticsearch:标量量化 101 - scalar quantization 101

作者&#xff1a;BENJAMIN TRENT 什么是标量量化以及它是如何工作的&#xff1f; 大多数嵌入模型输出 float32 向量值。 虽然这提供了最高的保真度&#xff0c;但考虑到向量中实际重要的信息&#xff0c;这是浪费的。 在给定的数据集中&#xff0c;嵌入永远不需要每个单独维度…

java项目之驾校预约管理系统(ssm框架)

项目简介 校预约管理系统实现了以下功能&#xff1a; 管理员&#xff1a;首页、个人中心、学员管理、驾校教练管理、驾校车辆管理、预约管理、取消预约管理、驾校公告管理、系统管理。驾校教练&#xff1a;首页、个人中心、驾校教练管理、预约管理、取消预约管理。学员&#…

编译环境里存在yaml-cpp的多个版本时可能引起的问题

有时要编译的程序自带了特定版本的yaml-cpp&#xff0c;同时系统目录下也安装了更高版本的yaml-cpp&#xff0c;这时可能引起编译错误&#xff0c;就是某些yaml-cpp的API不认识&#xff0c;例如&#xff1a; 出现这种问题倒好办&#xff0c;正常情况下不可能&#xff0c;肯定能…

【Unity PlasticSCM】记录:从介绍 下载 到拉取项目

实习的时候项目是svn管理的&#xff0c;这次mini的项目管理最后选择了美术策划友好的plasticSCM&#xff0c;但之前没有接触过&#xff0c;所以决定花费一点时间去了解&#xff0c;然后记录一下中间遇到的一些问题。 了解及下载Plastic b站很详细介绍PlasticSCM&#xff1a;Un…

电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题

一、行业背景 随着国民经济的蓬勃发展&#xff0c;工业用电和居民用电需求迅速增加&#xff0c;电厂、变电站、输电线路高负荷运转&#xff0c;一旦某个节点发生故障&#xff0c;对生产、生活造成巨大的影响。目前电力行业生产现场人员、设备较多&#xff0c;而生产监督员有限…

JMeter简单使用

JMeter是一个功能强大的开源性能测试工具&#xff0c;用于对各种应用程序、协议和服务器进行性能和负载测试。它被广泛用于测试Web应用程序的性能&#xff0c;并可以模拟多种负载条件和行为。 JMeter使用 添加线程组 设置线程组的配置 设置请求 配置请求 添加监听器 查看压…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

2023年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2023年…

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞

蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞 一、蓝凌EIS简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现六、深度复现1、发送如花2、哥斯拉直连 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者…

一文教你解决git请求github时候超时的问题

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一文教你解决git请求github的时候超时问题 一. 问题二. 当前 ssh 实现原理三. 创建ssh key3.1 将ssh key加入github配置中3.2 测试连…

如何在 Mac 上切换用户?

如果您想与其他人共享您的 Mac&#xff0c;创建一个独立于您的个人帐户的新用户帐户可能会有所帮助。然而&#xff0c;不利的一面是&#xff0c;时不时地在不同的用户帐户之间切换可能是一件耗时的事情。幸运的是&#xff0c;我创建了本指南&#xff0c;解释如何在 Mac 上快速切…

使用 Pyro 和 PyTorch 的贝叶斯神经网络

一、说明 构建图像分类器已成为新的“hello world”。还记得当你第一次接触 Python 时&#xff0c;你的打印“hello world”感觉很神奇吗&#xff1f;几个月前&#xff0c;当我按照PyTorch 官方教程并为自己构建了一个运行良好的简单分类器时&#xff0c;我也有同样的感觉。 我…

Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】

实现网络加载商品数据的功能&#xff1a; 1、在AndroidManifest.xml中声明网络权限&#xff1b; 2、在app/build.gradle中添加okhttp, glide, gson等必需的第3方库&#xff1b; 3、在MainActivity中通过OkHttpClient连接给定的Web服务&#xff0c;获取商品数据&#xff1b;对…

RISC-V IDE MRS无感远程协助模块详解

RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块&#xff08;Sensorless Remote Assistant Module&#xff0c;以下简称SRA模块&#xff09;。SRA模块是一款支…

Leetcode刷题详解——按摩师

1. 题目链接&#xff1a;面试题 17.16. 按摩师 2. 题目描述&#xff1a; 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师…

无线渗透|Wi-Fi渗透思路

对于WPA2 WPA3的一些渗透思路 0x00 进行渗透时需知晓的基础知识 1.WPA2:是WPA的升级版&#xff0c;是针对保护无线网络安全而设计的无线网络保护系统&#xff0c;引入了PSK&#xff08;预共享密钥模式&#xff09;秘钥&#xff0c;加强了WPA的不足之处&#xff0c;但是因为使…

技术栈 业务架构 插件库

大前端 技术栈 业务架构 插件库

yolov5 pt转成nccn_yolov5

一&#xff1a;转换环境准备 python版本为Python 3.8.0&#xff0c;需要安装对应的版本包&#xff0c;torch1.10.0 torchvision0.11.0 torchaudio0.10.0 pip3 install torch1.10.0 torchvision0.11.0 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html…