西乡城建局网站,脚本外链平台,wordpress评论怎么去掉网址,响应式网站开发遇到的问题#x1f64b;大家好#xff01;我是毛毛张! #x1f308;个人首页#xff1a; 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念#xff0c;今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码… 大家好我是毛毛张! 个人首页 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码分析 文章目录 1 HicariCP连接池概述1.1 HicariCP连接池简介 2 快速入门案例2.1 后端代码2.1.1 创建项目2.1.2 导入依赖方式1手动导入 HikariCP 依赖方式 2自动引入依赖 - 推荐本项目完整依赖 2.1.3 编写配置文件2.1.4 初始化数据库并创建对应实体类2.1.5 编写响应封装与前端展示VO2.1.6 编写业务逻辑2.1.7 跨域资源共享2.1.8 启动类2.1.9 测试 2.2 前端代码 3 配置详解3.1 常见配置3.2 数据源配置解析3.3 连接池配置详解 4 底层源码解析4.1 SpringBoot自动初始化配置4.2 默认的数据源 参考文献 1 HicariCP连接池概述
在上面介绍过HicariCP是SpringBoot2.0之后默认的数据库连接池特点就是简单高效史称最快的数据库连接池毛毛张将从以下几个方面展开对HicariCP连接池的介绍 首先简单介绍以下HicariCP连接池然后通过一个案例来帮助大家能够快速使用HicariCP连接池接着通过分析SpringBoot的底层代码来解释SringBoot默认的数据库连接池为HicariCP
1.1 HicariCP连接池简介
HikariCP 是一个高性能的JDBC数据库连接池基于BoneCP做了多项优化旨在提供更高的并发性能和更低的延迟。自SpringBoot 2.x版本后自然也包括SpringBoot 3.xHikariCP成为默认的数据库连接池只需导入HikariCP的JAR包并配置相关参数即可无缝集成并优化数据库连接池管理。HikariCP 的高性能优化主要体现在以下两个方面 FastList 替代 ArrayList 传统的数据库连接池大多使用ArrayList存储StatementHikariCP 自定义了FastList来优化这一操作。FastList的优化主要体现在两个方面 取消 ArrayList 的 get() 方法中的范围检查range check。由于数据库连接池管理的 List 中的索引合法性有保证因此不需要每次访问都进行索引合法性检查。改变 ArrayList 中 remove() 操作的遍历方式采用从尾部开始遍历而不是从头开始。由于连接池中的连接通常是逆序释放的后获取的连接先释放这样优化后每次关闭连接时可以更高效地找到需要释放的资源提升了效率。 ConcurrentBag 替代阻塞队列 大多数传统数据库连接池使用两个阻塞队列idle 和 busy来管理空闲连接和忙碌连接使用 Lock 机制来处理线程竞争但这种方式在高并发场景下可能会导致性能瓶颈。HikariCP通过使用 ConcurrentBag 替代了传统的阻塞队列极大地减少了锁的竞争提高了并发性能。ConcurrentBag的核心工作原理 sharedList存储所有数据库连接的共享队列使用 CopyOnWriteArrayList 类型支持并发操作。threadList线程本地存储避免了线程竞争每个线程会缓存自己获取的连接。waiters等待连接的线程数使用 AtomicInteger 类型。handoffQueue分配数据库连接的核心队列使用 SynchronousQueue 类型负责将空闲连接分配给请求的线程。 这种设计通过减少线程竞争和优化连接分配提高了连接池的效率特别适合高并发的环境。 其他优化 字节码精简HikariCP 在字节码上进行了优化编译后的字节码量极少这样可以使得更多的代码被 CPU 缓存从而提高程序的执行效率。减少字节码的大小是提高性能的基础HikariCP 在这方面做得非常好。优化代理和拦截器HikariCP 对代理和拦截器的实现进行了精简。例如它的 Statement 代理类仅有 100 行代码是 BoneCP 的十分之一。这减少了性能开销确保数据库连接池在执行 SQL 时更加高效。自定义集合类型FastStatementList为了提高对 Statement 的管理效率HikariCP 使用了自定义的集合类型 FastStatementList 来替代传统的 ArrayList。这样避免了每次获取元素时的范围检查并且采用逆序遍历的方式来优化 remove() 操作使得关闭连接时更加高效。自定义集合类型ConcurrentBagHikariCP 为了优化并发读写效率采用了 ConcurrentBag 代替传统的阻塞队列。这不仅提高了数据库连接分配的效率而且减少了锁的竞争显著提升了高并发场景下的性能。针对 BoneCP 缺陷的优化HikariCP 在设计时针对 BoneCP 中的一些缺陷进行了优化特别是在处理 CPU 时间片内的耗时方法调用时进一步提高了性能。 接下来毛毛张将结合一个完整的项目案例来介绍SpringBoot整合MySQL和HikariCP 连接池的过程并提供了完整的代码 2 快速入门案例
案例内容基于Spring Boot使用MyBatis-Plus框架结合HikariCP连接池查询并展示数据库中的全部用户信息
2.1 后端代码
2.1.1 创建项目
如何快速创建一个SpringBoot新项目可以参见毛毛张的这篇博客【SpringBoot教程】IDEA快速搭建正确的SpringBoot版本和Java版本的项目下面是毛毛张的完整后端代码文件结构如下图
2.1.2 导入依赖
在 Spring Boot 项目中默认使用 HikariCP 作为数据库连接池因此在大多数情况下无需手动引入该依赖。若项目中使用了以下某些 starter 依赖HikariCP 会自动作为连接池配置 spring-boot-starter-jdbcspring-boot-starter-data-jpamybatis-spring-boot-startermybatis-plus-boot-starter 需要特别注意的是mybatis 和 mybatis-plus 已经间接依赖了 spring-boot-starter-jdbc因此这两个 starter 会自动引入 HikariCP从而避免重复配置。
方式1手动导入 HikariCP 依赖
如果没有导入HikariCP我们可以通过下面的方式手动导入HikariCP依赖dependencygroupIdcom.zaxxer/groupIdartifactIdHikariCP/artifactIdversion6.2.1/version
/dependency方式 2自动引入依赖 - 推荐 在使用SpringBoot默认配置时不需要手动添加 HikariCP 依赖可以通过导入下面依赖的方式来自动引入HikariCP依赖 !-- 引入 Spring Boot JDBC 模块 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId
/dependency!-- 引入 Spring Boot JPA 模块 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId
/dependency!-- 引入 MyBatis Plus 模块 --
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.2/version
/dependency本项目完整依赖
需要注意的是在使用 HikariCP 作为连接池的同时还需要单独导入 MySQL 数据库驱动通常通过引入 mysql-connector-java 依赖来实现毛毛张在这个任务中为了方便使用了Mybatis-plus框架整个项目的pom.xml文件为?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.zzx/groupIdartifactIdspringboot-HicariCP-demo/artifactIdversion0.0.1-SNAPSHOT/versionnamespringboot-HicariCP-demo/namedescriptionspringboot-HicariCP-demo/descriptionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-parent/artifactIdversion2.7.6/version/parentpropertiesjava.version1.8/java.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingspring-boot.version2.7.6/spring-boot.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- MySQL 数据库驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope !-- 运行时依赖 --/dependency!-- MybatisPlus 核心库 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.2/version/dependency!-- 热部署 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding/configuration/pluginplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion${spring-boot.version}/versionconfigurationmainClasscom.zzx.SpringbootHicariCpDemoApplication/mainClassskiptrue/skip/configurationexecutionsexecutionidrepackage/idgoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build/project2.1.3 编写配置文件
下面是整个项目的配置文件application.yaml关键部分已被注释出来了更多详细的解释可以参见第三节的内容server:port: 8080
spring:# HikariCP 连接池配置datasource:url: jdbc:mysql://localhost:3306/springboot?useSSLfalseautoReconnecttrueuseUnicodetruecharacterEncodingUTF-8allowPublicKeyRetrievaltrueserverTimezoneUTCdriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: abc123# 指定数据源类型为 HikariDataSourcetype: com.zaxxer.hikari.HikariDataSource# Hikari 连接池的详细配置hikari:# 连接池名称pool-name: HikariCP# 最小空闲连接数minimum-idle: 5# 空闲连接超时时间毫秒idle-timeout: 600000# 连接池的最大大小maximum-pool-size: 10# 是否自动提交事务auto-commit: true# 连接的最大生命周期毫秒max-lifetime: 1800000# 连接超时时间毫秒connection-timeout: 30000# 测试连接的 SQL 语句connection-test-query: SELECT 1logging:level:org.springframework.jdbc.core.JdbcTemplate: DEBUGmybatis-plus:# xml扫描多个目录用逗号或者分号分隔告诉 Mapper 所对应的 XML 文件位置mapper-locations: classpath:mapper/*.xmlconfiguration:auto-mapping-behavior: full# 开启驼峰映射map-underscore-to-camel-case: true# 如果查询结果中包含空值的列则 MyBatis 在映射的时候不会映射这个字段call-setters-on-nulls: true# 这个配置会将执行的sql打印出来在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl2.1.4 初始化数据库并创建对应实体类 创建名为springboot的数据库并创建user_info表 -- 创建数据库
CREATE DATABASE IF NOT EXISTS springboot CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE springboot;-- 删除已存在的 user_info 表如果存在
DROP TABLE IF EXISTS user_info;-- 创建 user_info 表
CREATE TABLE user_info (id INT NOT NULL AUTO_INCREMENT,user_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,pass_word VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,age INT NULL DEFAULT NULL,gender VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (id) USING BTREE
) ENGINE InnoDB AUTO_INCREMENT 3 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci ROW_FORMAT Dynamic;-- 插入示例数据
INSERT INTO user_info (id, user_name, pass_word, age, gender) VALUES
(1, sam, password123, 32, M),
(2, hah, password456, 10, F);-- 确保外键检查被重新启用
SET FOREIGN_KEY_CHECKS 1; 对应实体类User package com.zzx.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;Data
TableName(user_info)
public class User {private Integer id; // 对应数据库中的 u_idprivate String userName; // 对应数据库中的 u_usernameprivate String passWord; // 对应数据库中的 u_passwordprivate Integer age; // 对应数据库中的 u_ageprivate String gender; // 对应数据库中的 u_gender
}
2.1.5 编写响应封装与前端展示VO
定义统一的响应封装类 ResVopackage com.zzx.reponse;public class ResVoT {private Integer code; // 状态码private String message; // 消息内容private T content; // 内容可以是任何类型的数据// 构造方法public ResVo(Integer code, String message, T content) {this.code code;this.message message;this.content content;}// 成功的返回通常是常用的内容可以为空public static T ResVoT success(T content) {return new ResVo(200, 成功, content);}// 失败的返回通常返回错误信息public static T ResVoT error(Integer code, String message) {return new ResVo(code, message, null);}// Getters and Setterspublic Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public T getContent() {return content;}public void setContent(T content) {this.content content;}
} 前端展示对象UserInfoVo在查询用户信息时通过是把查询到的结果封装在一个实体类中但是返回给前端的信息不一定是用户的全部信息例如用户的密码就不能直接返回给前端或者不要返回所以毛毛张设计了一个这个类package com.zzx.model.vo;import lombok.Data;Data
public class UserInfoVo {//返回给前端展示的数据密码不能展示性别转化成数字private Integer id;private String username;private Integer age;private Integer gender;
} 为了节省传输的字符毛毛张将用户的信息对应的内容转化成数字再返回给前端因此设计了一个枚举类型UserSexEnumpackage com.zzx.enums;public enum UserSexEnum {M(1, 男), // M对应男值为 1F(0, 女); // F对应女值为 0private int code; // 对应的数字值1 或 0private String description; // 性别描述男 或 女// 构造方法用于设置枚举常量的描述和对应的代码UserSexEnum(int code, String description) {this.code code;this.description description;}// 获取性别描述public String getDescription() {return description;}// 获取对应的数字代码public int getCode() {return code;}// 根据传入的字符串 M 或 F 获取对应的性别枚举public static UserSexEnum fromString(String sexStr) {for (UserSexEnum sex : UserSexEnum.values()) {if (sex.name().equalsIgnoreCase(sexStr)) {return sex;}}throw new IllegalArgumentException(无效的性别字符串: sexStr);}// 根据 M 或 F 获取对应的数字代码public static int getCodeByString(String sexStr) {UserSexEnum sex fromString(sexStr);return sex.getCode();}
}由于User类和UserInfoVo不是完全一一对应的所以为了数据转换的方便毛毛张再这里专门写了一个转换类UserConverterpackage com.zzx.converter;import com.zzx.entity.User;
import com.zzx.enums.UserSexEnum;
import com.zzx.model.vo.UserInfoVo;import java.util.List;
import java.util.stream.Collectors;public class UserConverter{// 单个转换public static UserInfoVo toUserInfoDTO(User user) {UserInfoVo userInfoVo new UserInfoVo();userInfoVo.setId(user.getId());userInfoVo.setUsername(user.getUserName());userInfoVo.setAge(user.getAge());userInfoVo.setGender(UserSexEnum.getCodeByString(user.getGender()));return userInfoVo;}// 批量转换public static ListUserInfoVo toUserInfoDTOList(ListUser users) {// 使用 Java 8 的 stream API 进行批量转换return users.stream().map(UserConverter::toUserInfoDTO) // 对每个 User 对象进行转换.collect(Collectors.toList()); // 收集成 ListUserInfoDTO}
}2.1.6 编写业务逻辑
controller层UserControllerpackage com.zzx.controller;import com.zzx.converter.UserConverter;
import com.zzx.model.vo.UserInfoVo;
import com.zzx.reponse.ResVo;
import com.zzx.entity.User;
import com.zzx.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;RestController
RequestMapping(user)
public class UserController {Resourceprivate UserService userService;GetMapping(queryAllUserInfo) // 使用 GET 请求public ResVoListUserInfoVo queryAllUserInfo() {ListUser userInfoList userService.queryAllUserInfo();return ResVo.success(UserConverter.toUserInfoDTOList(userInfoList));}
} service层接口UserServicepackage com.zzx.service;import com.zzx.entity.User;import java.util.List;public interface UserService {ListUser queryAllUserInfo();
}服务层实现类UserServiceImplpackage com.zzx.service.impl;import com.zzx.entity.User;
import com.zzx.mapper.UserMapper;
import com.zzx.service.UserService;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;Service
public class UserServiceImpl implements UserService {Resourceprivate UserMapper userMapper;Overridepublic ListUser queryAllUserInfo() {return userMapper.queryAllUserInfo();}
}mapper层UserMapperpackage com.zzx.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zzx.entity.User;import java.util.List;public interface UserMapper extends BaseMapperUser {ListUser queryAllUserInfo();
} Mapper 层 SQL 映射配置文件UserMapper.xml?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.zzx.mapper.UserMapper!-- 声明标签写sql语句 crud select insert update delete每个标签对应接口的一个方法 方法的一个实现注意mapper接口不能重载 因为mapper.xml无法识别 根据方法名识别--!-- 查询所有用户 --select idqueryAllUserInfo resultTypecom.zzx.entity.UserSELECT id, user_name, pass_word, age, gender FROM user_info/select/mapper2.1.7 跨域资源共享
由于毛毛张这个代码还有前端代码涉及到和前端交互还需要做一个跨域资源共享的配置毛毛张没有使用CrossOrigin而是通过拦截器的方式实现的package com.zzx.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class CorsInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {response.setHeader(Access-Control-Allow-Origin, *); // 允许所有来源response.setHeader(Access-Control-Allow-Methods, GET, POST, PUT, DELETE);response.setHeader(Access-Control-Allow-Headers, Origin, Content-Type, Accept, Authorization);response.setHeader(Access-Control-Allow-Credentials, true);// 处理OPTIONS请求if (OPTIONS.equalsIgnoreCase(request.getMethod())) {response.setStatus(HttpServletResponse.SC_OK);return false; // 返回false表示不再执行后续的Controller方法}return true; // 继续执行其他拦截器或Controller方法}
} 配置类package com.zzx.config;import com.zzx.interceptor.CorsInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration
public class WebConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册 CORS 拦截器registry.addInterceptor(new CorsInterceptor()).addPathPatterns(/**) // 拦截所有路径.excludePathPatterns(/login, /error); // 排除登录和错误页面}
}2.1.8 启动类
启动类SpringbootHicariCpDemoApplicationpackage com.zzx;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
MapperScan(com.zzx.mapper)
public class SpringbootHicariCpDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootHicariCpDemoApplication.class, args);}}2.1.9 测试
启动后端程序可以在浏览器中输入http://localhost:8080/user/queryAllUserInfo返回结果如下则表示后端代码正确无误 完整的后端代码已上传至毛毛张Github仓库https://github.com/zzxrepository/SpringBootTutorial/tree/master/springboot-mysql/springboot-HicariCP-demo 2.2 前端代码
前端代码和之前毛毛张介绍的Mybatis教程的代码是一样的毛毛张在这里不做过多的介绍了感兴趣的可以查看毛毛张的相关博客【SpringBoot教程】SpringBoot整合Mybatis - 前后端分离项目 - vue3完整前端代码已上传至毛毛张Github仓库https://github.com/zzxrepository/SpringBootTutorial/tree/master/springboot-mysql/springboot-mysql-demo-vue
3 配置详解
3.1 常见配置 下面是HicariCP连接池常见的配置 spring:datasource:url: jdbc:mysql://localhost:3306/springboot?useSSLfalseautoReconnecttrueuseUnicodetruecharacterEncodingUTF-8allowPublicKeyRetrievaltrueserverTimezoneUTCdriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: abc123type: com.zaxxer.hikari.HikariDataSource # 指定数据源类型为 HikariDataSourcehikari: # Hikari 连接池的详细配置pool-name: HikariCP # 连接池名称minimum-idle: 5 # 最小空闲连接数idle-timeout: 600000 # 空闲连接超时时间毫秒maximum-pool-size: 10 # 连接池的最大大小auto-commit: true # 是否自动提交事务max-lifetime: 1800000 # 连接的最大生命周期毫秒connection-timeout: 30000 # 连接超时时间毫秒connection-test-query: SELECT 1 # 测试连接的 SQL 语句上面配置主要分为两部分一部分是数据源配置一部分是数据库连接池配置
3.2 数据源配置解析
下面部分属于数据源配置spring:datasource:# 数据库连接URL指定数据库地址、端口、库名以及连接参数url: jdbc:mysql://localhost:3306/springboot?useSSLfalseautoReconnecttrueuseUnicodetruecharacterEncodingUTF-8allowPublicKeyRetrievaltrueserverTimezoneUTC# MySQL 8.0 及以上需要 cj5.7 以下可去掉 cjdriver-class-name: com.mysql.cj.jdbc.Driver # 数据库的用户名和密码username: rootpassword: abc123# 指定使用的数据库连接池实现type: com.zaxxer.hikari.HikariDataSource配置解析 url定义数据库连接的详细信息包括 localhost:3306服务器地址和端口springboot数据库名称连接参数 driver-class-name指定数据库连接的驱动MySQL 8.x使用 com.mysql.cj.jdbc.Driverusername 和 password提供访问数据库的身份凭证。type指定数据库连接池的实现配置为 com.zaxxer.hikari.HikariDataSource表示使用 HikariCP 作为数据库连接池。如果需要使用 Druid应将其替换为 com.alibaba.druid.pool.DruidDataSource。 url连接参数详解 useUnicodetruecharacterEncodingUTF-8 确保数据库与应用之间的字符编码一致防止乱码问题。推荐使用 utf8mb4 以支持更多字符如表情符号。 serverTimezoneUTC 指定数据库服务器的时区避免时间处理错误。可选值 UTC世界标准时间比北京时间CST早 8 小时。Asia/Shanghai中国标准时间推荐。 说明MySQL 6.0 及以上的 com.mysql.cj.jdbc.Driver 需要显式指定时区否则可能导致时区不匹配的异常。 useSSLfalse 指定是否启用 SSL 连接。在生产环境如 Linux 服务器部署通常关闭 SSL 连接以减少额外的安全配置。建议在公共网络或云数据库环境中建议开启 SSL。 autoReconnecttruefailOverReadOnlyfalse autoReconnecttrue允许 JDBC 驱动在连接意外断开时自动重连已弃用推荐使用连接池。failOverReadOnlyfalse防止发生故障转移时连接错误地设置为只读模式。 allowPublicKeyRetrievaltrue 允许客户端从 MySQL 服务器检索公钥以进行密码验证。安全建议生产环境下尽量避免使用该参数建议启用 SSL 进行安全通信。 zeroDateTimeBehaviorconvertToNull 当数据库中的日期时间值为 0000-00-00 00:00:00 时转换为 null避免 Java 应用程序在处理无效日期值时出错。 rewriteBatchedStatementstrue 启用批量执行优化提高批量 INSERT、UPDATE 的执行效率。适用于大数据量操作不适用于 SELECT 查询。
3.3 连接池配置详解 下面是关于连接池的配置部分 spring:datasource:hikari:# 连接池名称pool-name: HikariCP# 最小空闲连接数minimum-idle: 5# 空闲连接超时时间毫秒idle-timeout: 600000# 连接池的最大大小maximum-pool-size: 10# 是否自动提交事务auto-commit: true# 连接的最大生命周期毫秒max-lifetime: 1800000# 连接超时时间毫秒connection-timeout: 30000# 测试连接的 SQL 语句connection-test-query: SELECT 1关于HikariCP连接池的详细配置解析如下
属性描述构造器默认值默认配置 validate 之后的值validate 重置autoCommit自动提交从池中返回的连接truetrue–connectionTimeout等待来自池的连接的最大毫秒数30000 (30秒)30000如果小于 250 毫秒则重置为 30 秒idleTimeout连接允许在池中闲置的最长时间600000 (10分钟)受 maxLifetime 影响条件不符可能重置为 0如果设置小于 10 秒则重置为 10 秒maxLifetime池中连接最长生命周期1800000 (30分钟)1800000如果小于 30 秒则重置为 30 分钟connectionTestQuery如果支持 JDBC4建议不设置此属性nullnull–minimumIdle池中维护的最小空闲连接数1010小于 0 或大于 maxPoolSize 则重置为 maxPoolSizemaximumPoolSize池中最大连接数包括闲置和使用中的连接1010如果小于 1则重置为默认 10 或 minIdle 的值metricRegistry指定 Codahale/Dropwizard MetricRegistry 的实例nullnull–healthCheckRegistry指定 Dropwizard HealthCheckRegistry 的实例nullnull–poolName连接池的用户定义名称主要用于日志和 JMX 管理nullHikariPool-1–initializationFailTimeout控制池是否在初始化连接失败时快速失败11–isolateInternalQueries是否在独立事务中隔离内部池查询falsefalse–allowPoolSuspension是否允许通过 JMX 暂停和恢复池falsefalse–readOnly从池中获取的连接是否默认处于只读模式falsefalse–registerMbeans是否注册 JMX 管理 BeanMBeansfalsefalse–catalog设置默认 catalogdefaultnull–connectionInitSql在新连接创建后执行的 SQL 语句nullnull–driverClassNameJDBC URL 解析失败时指定驱动程序类名称nullnull–transactionIsolation连接的默认事务隔离级别nullnull–validationTimeout连接测试活动的最大时间5000 (5秒)5000如果小于 250 毫秒则重置为 5 秒leakDetectionThreshold检测潜在的连接泄漏的时间阈值00必须 0 且 ≥ 2 秒且不能大于 maxLifetimedataSource设置要包装的数据源实例nullnull–schema设置默认 schemadefaultnull–threadFactory设置用于创建池线程的 ThreadFactory 实例nullnull–scheduledExecutor设置用于池内部任务的 ScheduledExecutorService 实例nullnull–
更具体的可以看官方配置文档
4 底层源码解析
前面毛毛张介绍了HikariCP连接池的配置下面毛毛张通过分析源码的方式来介绍以下为什么说SoringBoot2.x之后默认使用的连接池是HikariCP从SpringBoot自动初始化配置 和 默认的数据源 两个角度理解。
4.1 SpringBoot自动初始化配置
找到spring-boot-autocinfigure-2.7.6.jar依赖下面的org.springframework.boot.autoconfigure.jdbc包 关键代码如下 找到HikariCP数据源的配置你可以发现为了支持动态更新配置基于MXBean)这里还设计了一层HikariConfigMXBean接口
4.2 默认的数据源
首先springboot-starter-jdbc中默认加载了HikariCP 其次在配置初始化或者加载时都是第一个被加载的
参考文献
https://juejin.cn/post/7329033419328307226https://zhuanlan.zhihu.com/p/686960884https://blog.csdn.net/hansome_hong/article/details/124320410https://juejin.cn/post/7224499191962714171#heading-2https://blog.csdn.net/hansome_hong/article/details/124320410https://pdai.tech/md/spring/springboot/springboot-x-mysql-HikariCP.htmlhttps://blog.csdn.net/doubiy/article/details/131578389https://www.cnblogs.com/lyluoye/p/16627840.htmlhttps://github.com/brettwooldridge/HikariCPhttps://www.cnblogs.com/zhaojinhui/p/17579010.htmlhttps://javabetter.cn/springboot/mysql-druid.html 都看到这了不妨一键三连再走吧 欢迎和毛毛张一起探讨和交流 联系方式点击下方个人名片