代码编织梦想

常遇到的几种错误

Possibly consider using a shorter maxLifetime value

SpringCloud 中使用HikariPool 报错Possibly consider using a shorter maxLifetime value

HikariPool-1 - Failed to validate connection 
com.mysql.cj.jdbc.ConnectionImpl@115a8473 (No operations allowed after connection closed.). 
Possibly consider using a shorter maxLifetime value

Connection is not available, request timed out after xxxxxms

Connection is not available, request timed out after 59089ms

No operations allowed after connection closed

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed

对于以上几种错误,我经过查阅,众说纷纭,大部分解决了的都是(并不是长久之计)

  • 按照提示缩短了maxLifetime到5分钟
  • 增加测试查询语句connection-test-query

来解决问题,并没有实际的分析问题根源或者优化其他配置项,经过查询相关文档、尝试、观察、测试,得出以下结论,给大家讲解,急于处理问题的可以参考下面的配置进行调整,注意标明的注释,可做适当调整,后文我将对常用的配置项进行讲解

常见配置及注释说明,可以使用并根据说明调整

spring:
  datasource:
    hikari: # 时间单位均为ms
      minimum-idle: 5 # 建议不设置,但如使用idle-timeout,该值需要小于maximum-pool-size
      maximum-pool-size: 10 # hikari做过测试根据CPU计算最优最大连接池,如下
      # connections = ((cpu_core_count * 2) + effective_spindle_count)
      # 如4-Core i7,公式为9 = ((4 * 2) + 1),最后一个是有效的主核心数
      auto-commit: true # 默认
      idle-timeout: 300000 # 该值建议小于max-lifetime
      max-lifetime: 600000 # 该值建议小于数据库的连接关闭等待时间,详细的看下面分析
      connection-timeout: 30000 # 默认30s,连接超时会报异常
      # Connection is not avaitabte, request timed out after 59089ms
      validation-timeout: 5000 # 支持JDBC4的是isValid超时时间,不支持的是testQuery超时时间
      connection-test-query: 'SELECT 1' # 支持JDBC4的不建议使用,因为JDBC4的isValid方法效率更高

详细分析

HikariCP官方说明文档

首先确认网络问题

将数据库连接到本地(注意需要保持数据库的配置和线上一致,否则没有可比性,无法得出结论),并进行长时间运行测试,如果没有问题,则是由于网络原因链接超时,造成了关闭的连接本地调用失败、或创建连接超时无法使用,这种情况优化网络配置、增加带宽、将服务和数据库部署在同一网络下等方案即可

maximum-pool-size建议值

HikariCP对Pool-Sizing的论证及建议

hikari做过测试根据CPU计算最优最大连接池,详细的可以看链接的官方讲解,比较长,总结如下

  • connections = ((cpu_core_count * 2) + effective_spindle_count)
  • 如4-Core i7,公式为9 = ((4 * 2) + 1),最后一个是有效的主核心数

minimum-idle

该值HikariCP建议不设置,就使用默认的,也就是同maximum-pool-size一边大,但是实际应用中可能需要保留少一些,随着业务的增加变到maximum-pool-size,而不是长期占用maximum-pool-size这么多的连接数。

  • 所以可以设置一个比较小的、或者常态化下使用的连接量即可,建议5-10即可,不可大于maximum-pool-size

idle-timeout

连接允许在池中闲置的最长时间,默认为600000,即10分钟。只有当minimum-idle小于maximum-pool-size时,这个参数才生效,当空闲连接数超过minimum-idle,而且连接空闲时间超过idle-timeout,则会被移除。

  • 设置时,该值建议小于max-lifetime

max-lifetime

官方建议是比数据库的wait_timeout小几秒,但是MySQL默认一般都是8小时,28800s(数据库单位是s秒),如下图

# 查看数据库的wait_timeout、interactive_timeout
show variables like '%timeout%';

在这里插入图片描述
所以设置有几种方式

  • 根据数据的超时时长,减少一些时间,然后变为毫秒数,配置该值
  • 使用默认值
  • 使用小于默认值的,如5分钟、10分钟、15分钟等

但是该值一定要大于idle-timeout

connection-timeout

连接池等待连接的最大毫秒数,默认为30000ms,也就是30s,允许最小时间是250毫秒,如果小于250毫秒,则被重置回30秒。

  • 根据网络情况,处理器性能,服务可接受超时时长,配置合理的值即可
  • 一般设置短一点,提高程序的响应速度,但是要大于网络的平均响应时长,否则全会连接超时
  • 小于idle-timeout
# 出现这种错误一般就是连接超时了,检查网络响应时间、网络状态等
Connection is not avaitabte, request timed out after 59089ms

validation-timeout

支持JDBC4的驱动,是调用isValid验证连接池中连接有效性的超时时间
不支持JDBC4的驱动,是调用testQuery的超时时间

  • 该值尽量小一些,使用默认值即可,但是要小于connection-timeout

connection-test-query

支持JDBC4的不建议使用,因为JDBC4的驱动有isValid方法,是通过发送数据包验证连接,效率更高
不支持JDBC4的驱动,是执行该配置的SQL,比较重,效率不好

  • 如果没有配置该值,而且驱动不支持JDBC4,会有错误提示,所以没有配置,也没有提示isValid相关错误,即表示支持
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33598419/article/details/127995929

使用git搭建自己的私有/个人git仓库_aubrey-j的博客-爱代码爱编程_个人私有git仓库

使用Git搭建自己的私有/个人Git仓库 准备一下安装Git添加Git管理账户/账户和密码配置Git的SSH访问配置SSH访问客户端生成ssh私钥上传服务器服务器将上传的私钥添加到服务器的秘钥验证文件中客户端验证连接

Linux脚本刷新屏幕显示输出,像top命令一下刷新屏幕-爱代码爱编程

Linux脚本刷新屏幕显示输出,像top命令一下刷新屏幕 首先说一下怎么监听端口流量刷新屏幕脚本引用1引用2引用3 我自己准备在服务器上写一个监听IP:端口流量统计的一个脚本,但是每次都去手动执行脚本很麻烦,一直执行控制台输出又贼长,所以我就准备写一个像top命令一样的刷新脚本,说一下我的心得,文章结尾是我整理的资料以免大家再到处去找,已声明转载

SpringBoot+Vue讲解系列介绍(本专辑实体书已出版)-爱代码爱编程

最近一直在开发SpringBoot及SpringCloud前后端分离的分布式项目,打算把平时记录在本地的项目代码、笔记及疑难问题等整理汇集成文章发表。 博文可以归纳为两大部分:《SpringBoot讲解》、《SpringBoot+Vue讲解》 最新整理出来的应该是SpringBoot全家桶及Vue技术。 1.教育理念 熟悉我的人应该知道,我的教育方

SpringBoot学习2——整合事务、HikariCP、druid、thymeleaf、Restful简单入门-爱代码爱编程

文章目录 0.学习目标1. 了解SpringBoot1.1.什么是SpringBoot1.2.为什么要学习SpringBoot1.3.SpringBoot的特点2.快速入门2.1.创建工程2.2.引入依赖2.3.编写HelloController2.4.启动测试2.5.详解2.5.1.启动器2.5.2.@EnableAutoConfiguratio

Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!-爱代码爱编程

目录 前言PostgreSql VS MySqlHikariCP VS DruidSwagger2自定义参数配置一览结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布完毕),目前已支持postgresql数据库,HikariCP连接池和swagger2(文末有生成器获取链接,喜欢的朋友可以下载使用,永久免费,推荐大家以

12.微服务与分布式—1.SpringBoot-爱代码爱编程

1. springboot概念 在这一部分,我们主要了解以下3个问题: 什么是SpringBoot为什么要学习SpringBootSpringBoot的特点 什么是SpringBoot springboot是spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动spring项目 为什么要学习SpringBoot spring

KKB : 为什么要学习springboot,springboot整合其他框架步骤-爱代码爱编程

什么是springboot? springboot是spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动spring项目   为什么要学习springboot? springboot可以简化spring框架的复杂配置,不需要配置web.xml和spring.xml 。可以解决混乱的依赖管理问题,且 springboot内嵌Tomcat

SpringBoot整合SpringMVC--JDBC--mybatis-爱代码爱编程

1前一篇案例已经能实现mvc自动配置,这里我们主要解决以下3个问题 整合MVC 修改端口 查看SpringBoot的全局属性可知,端口通过以下方式配置:修改application。.properties 访问静态资源 ResourceProperties的类,里面就定义了静态资源的默认查找路径: 默认的静态资源路径为: classpath:/ME

【得物技术】TDengine在得物的落地应用-爱代码爱编程

背景 作为一家互联网电商公司,得物有许多系统和场景都需要做流量的监控和防护,所以在深度定制化开源流控防护组件Sentinel时我们加入了许多功能,帮助提升各业务系统的流控防护。 在开发过程中,我们发现开源版本的Sentinel不支持流控数据持久化,而我们非常需要这样的功能:我们需要一款数据库,它能够承载大量的流量监控数据,并能对数据进行存储和高效查询。

hikaricp druid比较_Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!...-爱代码爱编程

前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布完毕),目前已支持postgresql数据库,HikariCP连接池和swagger2(文末有生成器获取链接,喜欢的朋友可以下载使用,永久免费,推荐大家以安装idea插件的方式使用,简单快捷),顺便讲解一下postgresql和mysql的区别,HikariCP和Druid的区别以及sw

60分钟快速掌握RabbitMQ,java面试技巧和注意事项-爱代码爱编程

简介 HikariCP 是用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能,另外,和 druid 一样,HikariCP 也支持监控功能。HikariCP 是目前最快的连接池,就连风靡一时的  BoneCP  也停止维护,主动让位给它,SpringBoot 也把它设

springboot知识点整理_繁华哟的博客-爱代码爱编程

目录 1.对SpringBoot的认识 1.1.什么是SpringBoot 1.2.SpringBoot解决了哪些痛点 1.3.SpringBoot有哪些特性 2. 入门案例 2.1.新建module 2.2.

easyexcel单字段自定义转换@excelproperty::converter无效_aubrey-j的博客-爱代码爱编程

EasyExcel单字段自定义转换@ExcelProperty::converter无效 前提实体转换器调用 注意事项实体构造器声明实体属性命名规范源码分析 实现Converter接口实现Converter

springboot_欲搬砖的博客-爱代码爱编程

Maven高级 依赖管理 我们现在已经能把项目拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用<dependency>标签来进行jar包的引入即可。 <dependency>其实就是依赖,关于依赖管理里面都涉及哪些内容,我们就一个个来学习下: 依赖传递 可选依赖 排除依赖