Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
通过上一节的学习,我们已经学会如何应用Spring中的JdbcTemplate
来完成对MySQL的数据库读写操作。接下来通过本篇文章,重点说说在访问数据库过程中的一个重要概念:数据源(Data Source),以及Spring Boot中对数据源的创建与配置。
基本概念
在开始说明Spring Boot中的数据源配置之前,我们先搞清楚关于数据访问的这些基本概念:
什么是JDBC?
Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
JDBC API主要位于JDK中的java.sql
包中(之后扩展的内容位于javax.sql
包中),主要包括(斜体代表接口,需驱动程序提供者来具体实现):
- DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
- Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
- Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
- Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
- CallableStatement:用以调用数据库中的存储过程。
- SQLException:代表在数据库连接的建立和关闭和SQL语句的执行过程中发生了例外情况(即错误)。
什么是数据源?
可以看到,在java.sql
中并没有数据源(Data Source)的概念。这是由于在java.sql
中包含的是JDBC内核API,另外还有个javax.sql
包,其中包含了JDBC标准的扩展API。而关于数据源(Data Source)的定义,就在javax.sql
这个扩展包中。
实际上,在JDBC内核API的实现下,就已经可以实现对数据库的访问了,那么我们为什么还需要数据源呢?主要出于以下几个目的:
- 封装关于数据库访问的各种参数,实现统一管理
- 通过对数据库的连接池管理,节省开销并提高效率
在Java这个自由开放的生态中,已经有非常多优秀的开源数据源可以供大家选择,比如:DBCP、C3P0、Druid、HikariCP等。
而在Spring Boot 2.x中,对数据源的选择也紧跟潮流,采用了目前性能最佳的HikariCP。接下来,我们就来具体说说,这个Spring Boot中的默认数据源配置。
默认数据源:HikariCP
由于Spring Boot的自动化配置机制,大部分对于数据源的配置都可以通过配置参数的方式去改变。只有一些特殊情况,比如:更换默认数据源,多数据源共存等情况才需要去修改覆盖初始化的Bean内容。本节我们主要讲Hikari的配置,所以对于使用其他数据源或者多数据源的情况,在之后的教程中学习。
在Spring Boot自动化配置中,对于数据源的配置可以分为两类:
- 通用配置:以
spring.datasource.*
的形式存在,主要是对一些即使使用不同数据源也都需要配置的一些常规内容。比如:数据库链接地址、用户名、密码等。这里就不做过多说明了,通常就这些配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- 数据源连接池配置:以
spring.datasource.<数据源名称>.*
的形式存在,比如:Hikari的配置参数就是spring.datasource.hikari.*
形式。下面这个是我们最常用的几个配置项及对应说明:
spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.idle-timeout=500000 spring.datasource.hikari.max-lifetime=540000 spring.datasource.hikari.connection-timeout=60000 spring.datasource.hikari.connection-test-query=SELECT 1
这些配置的含义:
spring.datasource.hikari.minimum-idle
: 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-sizespring.datasource.hikari.maximum-pool-size
: 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值spring.datasource.hikari.idle-timeout
: 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。spring.datasource.hikari.max-lifetime
: 连接最大存活时间,不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短spring.datasource.hikari.connection-timeout
: 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒spring.datasource.hikari.connection-test-query
: 用于测试连接是否可用的查询语句
更多完整配置项可查看下表:
name | 描述 | 构造器默认值 | 默认配置validate之后的值 | validate重置 |
---|---|---|---|---|
autoCommit | 自动提交从池中返回的连接 | TRUE | TRUE | – |
connectionTimeout | 等待来自池的连接的最大毫秒数 | SECONDS.toMillis(30) = 30000 | 30000 | 如果小于250毫秒,则被重置回30秒 |
idleTimeout | 连接允许在池中闲置的最长时间 | MINUTES.toMillis(10) = 600000 | 600000 | 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒 |
maxLifetime | 池中连接最长生命周期 | MINUTES.toMillis(30) = 1800000 | 1800000 | 如果不等于0且小于30秒则会被重置回30分钟 |
connectionTestQuery | 如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性 | null | null | – |
minimumIdle | 池中维护的最小空闲连接数 | -1 | 10 | minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize |
maximumPoolSize | 池中最大连接数,包括闲置和使用中的连接 | -1 | 10 | 如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值 |
metricRegistry | 该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例,供池使用以记录各种指标 | null | null | – |
healthCheckRegistry | 该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息 | null | null | – |
poolName | 连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 | null | HikariPool-1 | – |
initializationFailTimeout | 如果池无法成功初始化连接,则此属性控制池是否将 fail fast | 1 | 1 | – |
isolateInternalQueries | 是否在其自己的事务中隔离内部池查询,例如连接活动测试 | FALSE | FALSE | – |
allowPoolSuspension | 控制池是否可以通过JMX暂停和恢复 | FALSE | FALSE | – |
readOnly | 从池中获取的连接是否默认处于只读模式 | FALSE | FALSE | – |
registerMbeans | 是否注册JMX管理Bean(MBeans) | FALSE | FALSE | – |
catalog | 为支持 catalog 概念的数据库设置默认 catalog | driver default | null | – |
connectionInitSql | 该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。 | null | null | – |
driverClassName | HikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序,但对于一些较旧的驱动程序,还必须指定driverClassName | null | null | – |
transactionIsolation | 控制从池返回的连接的默认事务隔离级别 | null | null | – |
validationTimeout | 连接将被测试活动的最大时间量 | SECONDS.toMillis(5) = 5000 | 5000 | 如果小于250毫秒,则会被重置回5秒 |
leakDetectionThreshold | 记录消息之前连接可能离开池的时间量,表示可能的连接泄漏 | 0 | 0 | 如果大于0且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为0 . 即如果要生效则必须>0,而且不能小于2秒,而且当maxLifetime > 0时不能大于maxLifetime |
dataSource | 这个属性允许你直接设置数据源的实例被池包装,而不是让HikariCP通过反射来构造它 | null | null | – |
schema | 该属性为支持模式概念的数据库设置默认模式 | driver default | null | – |
threadFactory | 此属性允许您设置将用于创建池使用的所有线程的java.util.concurrent.ThreadFactory的实例。 | null | null | – |
scheduledExecutor | 此属性允许您设置将用于各种内部计划任务的java.util.concurrent.ScheduledExecutorService实例 | null | null | – |
代码示例
本文的相关例子可以查看下面仓库中的chapter3-2
目录:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star
支持,您的关注是我坚持的动力!
参考资料
欢迎关注我的公众号:程序猿DD,获得独家整理的学习资源和日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:didispace.com
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Serverless 基本概念入门
从行业趋势看,Serverless 是云计算必经的一场革命 2019 年,Serverless 被 Gartner 称为最有潜力的云计算技术发展方向,并被赋予是必然性的发展趋势。Serverless 从底层开始变革计算资源的形态,为软件架构设计与应用服务部署带来了新的设计思路。 为此,我们策划了Serverless 技术专栏,从基础概念入门,到前后台架构设计、应用拓展、最佳实践等多维度,揭开 Serverless 的面纱,带你走进无服务器的世界。 什么是 Serverless? Serverless ,按中文翻译,称为「无服务器」。 这究竟是一种什么样的形态或产品呢?无服务器,就是真的没有服务器吗? 其实,在行业内,目前对于 Serverless 有几种解读方法: 在某些场景可以解读为一种软件系统架构方法,通常称为 Serverless 架构 而在另一些情况下,又可以代表一种产品形态,称为 Serverless 产品 在说起 Serverless 架构时,Serverless 代表的是利用 Serverless 形态的产品实现的应用架构,这种架构完全依托于云厂商或云平台提供产品完成系统...
- 下一篇
时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)
上一章聊到在车联网或物联网中对数据库的需求,以及 IoTDB 的整体架构,详情请见: 时序数据库 Apache-IoTDB 源码解析之系统架构(二) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star 。欢迎关注头条号:列炮缓开局,欢迎关注 OSCHINA博客 这一章主要想聊一聊: 行式存储、列式存储的区别 TsFile 的格式 行式与列式存储的区别 假如我们的逻辑上的数据表格式及数据为: 时间戳 人名 体温 1580950800 张三 36.5 1580950800 李四 36.9 1580950800 王五 36.7 那么他出现在硬盘格式就是: 行式数据 在我理解上,行式数据是把逻辑相关的数据在硬盘上放到一起,比如上面的例子,我们可以称之为体温表,所以在逻辑上:时间、人、体温,就成为了逻辑上紧密相关的数据。 所以把相关的数据的硬盘上的组织方式也变成连续的,假如我需要取 张三 的数据,那么当你读出 R1 文件块的时候,就是读出了所有 张三 相关的数据。 列式数据 列式数据在我理解是将物理相关的数据放到一起,比如时间是一类(long 类型)、名字是一类(string 类型)、体...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题