当前位置:   article > 正文

SpringBoot2.x 整合JDBC与数据源的配置原理_spring boot starter jdbc引入原理

spring boot starter jdbc引入原理

参考资料

SpringBoot官方文档#Working with SQL Databases

SpringBoot官方文档#Data Access

SpringBoot官方文档#Starters

HikariCP官方文档

Spring Boot默认HikariDataSource配置

默认数据源Hikari的配置详解

具体配置参考Druid Spring Boot Starter

springboot2.x整合JDBC与数据源配置原理解析

1 基本概念

1.1 JDBC

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语句的执行过程中发生了例外情况(即错误)。

1.2 数据源

java.sql中并没有数据源(Data Source)的概念。这是由于在java.sql中包含的是JDBC内核API.

另外还有个javax.sql包,其中包含了JDBC标准的扩展API。而关于数据源(Data Source)的定义,就在javax.sql这个扩展包中。

实际上,在JDBC内核API的实现下,就已经可以实现对数据库的访问了,那么我们为什么还需要数据源呢?主要出于以下几个目的:

  • 封装关于数据库访问的各种参数,实现统一管理

  • 通过对数据库的连接池管理,节省开销并提高效率

在Java的生态环境中,已经有非常多优秀的开源数据源,比如:DBCP、C3P0、DruidHikariCP(重点)等。

在Spring Boot 2.x中,对数据源的选择,采用了目前性能最佳的HikariCP。这个就是 Spring Boot2.x 中的默认数据源配置。


2 整合步骤

对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。
引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。
对我们来说只需要进行简单的设置即可。

版本:

SpringBoot(v2.3.2.RELEASE)

注意:

引入的组件,如果在父POM全局管理spring-boot依赖版本的前提下,只需要在项目pom文件的dependencies元素直接引入.

创建工程时,只需添加SQL模块的jdbc APIMySQL Driver即可,在配置文件中配置数据源信息,就可以获取到数据库的连接。

并且数据源默认使用的是HiKari。数据源信息是从DataSourceProperties获取的

2.1 引入JDBC的Starter

spring-boot-starter-jdbc

spring-boot-starter-jdbc提供了数据源配置、事务管理、数据访问等等功能,而对于不同类型的数据库,需要提供不同的驱动实现,才能更加简单地通过驱动实现根据连接URL、用户口令等属性直接连接数据库(或者说获取数据库的连接),因此对于不同类型的数据库,需要引入不同的驱动包依赖

pom.xml

<!--引入 SpringBoot 的 jdbc模块-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
  <exclusions>
      <!-- 如果是使用log4j2,则要排除SpringBoot 默认的logback 日志框架-->
      <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
      </exclusion>
  </exclusions>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

a4ZbM8.png

spring-boot-starter-jdbc模块(间接引入spring-core、spring-beans、spring-tx)、spring-boot-starter和HikariCP三个依赖。

引入spring-boot-starter-jdbc模块后,SpringBoot是自动配置了jdbcTamplate的,可以使用jdbcTamplate来操作数据查询。

2.2 引入连接数据库的驱动

mysql-connector-java

对于MySQL而言,需要引入mysql-connector-java

其中有数据库抽象驱动接口java.sql.Driver的实现类:

  • 对于mysql-connector-java而言,常用的实现是com.mysql.cj.jdbc.Driver(MySQL8.x版本)。

pom.xml

<!--mysql8 驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3 配置数据源(默认HikariCP)

HikariCP官网

springboot2.x默认是用com.zaxxer.hikari.HikariDataSource作为数据源。
2.0以下默认采用的是org.apache.tomcat.jdbc.pool.DataSource作为数据源。

springboot2.x的spring-boot-starter-jdbc模块 默认使用HikariCP作为数据库的连接池

HikariCP,也就是Hikari Connection Pool,Hikari连接池。HikariCP的作者是日本人,而Hikari是日语,意义和light相近,也就是"光"。Simplicity is prerequisite for reliability(简单是可靠的先决条件)是HikariCP的设计理念,他是一款代码精悍的高性能连接池框架,被Spring项目选中作为内建默认连接池,值得信赖。

由于Spring Boot的自动化配置机制,大部分对于数据源的配置都可以通过配置参数的方式去改变。

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

  • 通用配置: 以spring.datasource.*的形式存在,主要是对一些即使使用不同数据源也都需要配置的一些常规内容。

    比如:数据库链接地址、用户名、密码等。通常就这些配置:

    # 注意MySQL8.x需要指定服务时区属性
    spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true
    spring.datasource.username=xxx
    spring.datasource.password=xxx
    # 注意MySQL8.x的驱动
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 数据源连接池配置:以spring.datasource.<数据源名称>.*的形式存在。

    比如:Hikari 的配置参数就是spring.datasource.hikari.*形式。

    注意,需要指明数据源的类型:

    spring.datasource.type: com.zaxxer.hikari.HikariDataSource
    
    • 1

    下面这个是我们最常用的几个配置项及对应说明:

    # 连接池中允许的最大连接数。缺省值:10;推荐的公式:(cpu核心数*2+磁盘数)
    maximum-pool-size: 15
    # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
    idle-timeout: 600000
    # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
    connection-timeout: 30000
    # 连接只读数据库时配置为true, 保证安全
    read-only: false
    # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';)
    max-lifetime: 1800000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

2.3.1 数据源完整配置项表

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

2.3.2 使用其他数据源(Druid)

Druid(github)
Druid官网

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/486646
推荐阅读
相关标签
  

闽ICP备14008679号