mybatis插入mysql数据库PersistenceException 数据库连接超时

news2024/11/26 17:51:18

mybatis插入mysql部分数据失败

  • mybatis插入mysql数据库PersistenceException
    • 1、异常堆栈信息:
    • 2、问题原因:
    • 3、问题排查
      • 3.1 查看数据库连接信息
      • 3.2 问题解决
        • 3.2.1 Spring项目可以在配置文件里面设置
        • 3.2.2 修改conn改成局部变量

mybatis插入mysql数据库PersistenceException

1、异常堆栈信息:

2022-12-30 16:55:51.448 [ERROR] [pool-8-thread-7] [DataImportExportBizImpl.addSingleDirectCityIndex(830)] - 插入数据 productPriceVersionExtendSYDC :ProductPriceVersionExtends{id='null'versionId='1608748689566781442'hugCate='3'modifyShangQuanNum='197'risePriceShangQuanNum='28'risePriceShangQuanAvg='440.5%'risePriceShangQuanAbs='5.77'cutPriceShangQuanNum='172'cutPriceShangQuanAvg='256.3%'cutPriceShangQuanAbs='6.12'modifyCities='265'priceErrorNum='0'missingDataNum='195'},异常原因:{}
org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.sql.SQLException: Could not retrieve transation read-only status server
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: INSERT INTO `product_price_version_extends`         (          `version_id`,                                                                   `hugCate`,                                                                   `modify_shangQuan_num`,                                                                   `risePrice_shangQuan_num`,                                                                   `risePrice_shangQuan_avg`,                                                                   `risePrice_shangQuan_abs`,                                                                   `cutPrice_shangQuan_num`,                                                                   `cutPrice_shangQuan_avg`,                                                                   `cutPrice_shangQuan_abs`,                                                                   `modify_cities`,                                                                   `price_error_num`,                                                                   `missing_data_num`          )         VALUES         (          ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?,                                                       ?          )
### Cause: java.sql.SQLException: Could not retrieve transation read-only status server
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
        at com.sun.proxy.$Proxy51.insertProductPriceVersionExtends(Unknown Source)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl.addSingleDirectCityIndex(DataImportExportBizImpl.java:828)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl.distributeVersions4Cities(DataImportExportBizImpl.java:543)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl.distributeVersions(DataImportExportBizImpl.java:503)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl.access$600(DataImportExportBizImpl.java:46)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl$1.run$original$7FZkwEcB(DataImportExportBizImpl.java:232)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl$1.run$original$7FZkwEcB$accessor$0fP62Vg7(DataImportExportBizImpl.java)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl$1$auxiliary$6U7l5gMn.call(Unknown Source)
        at org.apache.skywalking.apm.plugin.jdk.threading.ThreadingMethodInterceptor_internal.intercept(InstanceMethodInterTemplate.java:93)
        at com.bj58.lego.ssp.sspmanager.smartprice.biz.impl.DataImportExportBizImpl$1.run(DataImportExportBizImpl.java)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: Could not retrieve transation read-only status server
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:902)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:892)
        at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3607)
        at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3576)
        at com.mysql.jdbc.PreparedStatement.checkReadOnlySafeStatement(PreparedStatement.java:1114)
        at com.mysql.jdbc.PreparedStatement.execute$original$yu3qsIFY(PreparedStatement.java:1134)
        at com.mysql.jdbc.PreparedStatement.execute$original$yu3qsIFY$accessor$Kzwe0bUf(PreparedStatement.java)
        at com.mysql.jdbc.PreparedStatement$auxiliary$4ocyMlSE.call(Unknown Source)
        at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:97)
        at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java)
        at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
        at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
        at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
        at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
        at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
        ... 16 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 91,292,434 milliseconds ago.  The last packet sent successfully to the server was 91,292,435 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1036)
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3661)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2417)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484)
        at com.mysql.jdbc.StatementImpl.executeQuery$original$ZHocNkSm(StatementImpl.java:1446)
        at com.mysql.jdbc.StatementImpl.executeQuery$original$ZHocNkSm$accessor$McGAG9h4(StatementImpl.java)
        at com.mysql.jdbc.StatementImpl$auxiliary$vzbyM8ID.call(Unknown Source)
        at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:97)
        at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java)
        at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3601)
        ... 29 more
Caused by: java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3643)
        ... 39 more
2022-12-30 16:56:02.418 [INFO ] [pool-12-thread-1] [ConfigClientLocalCache.checkCacheUpdate(224)] - usdtconfig:start check is need update! time=1425743179514649346--45181972-10-17 15:24:09

联系DBA同事帮忙定位问题,根据数据库日志发现数据库连接状态是sleep。已经断开了。

2、问题原因:

经过阅读日志,发现报错信息如下:
应该是连接超时引起的问题。提示要在数据库连接配置里面加autoReconnect=true。

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 91,292,434 milliseconds ago.  The last packet sent successfully to the server was 91,292,435 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

3、问题排查

3.1 查看数据库连接信息

我查看了一下数据库连接信息,发现链接信息已经加了&autoReconnect=true
经过查询发现:mysql5以上的,设置autoReconnect=true 是无效的 只有4.x版本,起作用。我的数据库版本是5.7.22,所以不生效。
关于mysql自动断开的问题研究结果如下,在mysql中有相关参数设定,当数据库连接空闲一定时间后,服务器就 会断开等待超时的连接: 同一时间,这两个参数(interactive_timeout和wait_timeout)只有一个起作用。到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用 wait_timeout。我建议是将这两个参数都修改,以免引起不必要的麻烦。

private static final String URL = "jdbc:mysql://XXX?useUnicode=true&characterEncoding=utf8&autoReconnect=true";

数据库连接工具输入一下命令:

-- 查看mysql数据库版本
select version();
-- 结果是 5.7.22-log

-- 查看全局 非交互式超时时间,如jdbc
show global variables like 'interactive_timeout';
-- 结果是3600 单位是S 一小时

-- 查看数据库连接超时时间
show global variables like 'wait_timeout';
-- 结果是3600 单位是S 一小时

-- 查看当前会话非交互式超时时间,如jdbc
show session variables like 'interactive_timeout';
-- 结果是3600 单位是S 一小时

3.2 问题解决

3.2.1 Spring项目可以在配置文件里面设置

#mysql默认使用ping模式,可以通过设置系统属性System.getProperties().setProperty("druid.mysql.usePingMethod", "false")更改为sql模式
#用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。默认:SELECT 1
spring.emily.datasource.config.mysql.validation-query="SELECT 1"
#单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法,默认:-1
spring.emily.datasource.config.mysql.validation-query-timeout=-1
#申请连接时执行validationQuery检测连接是否有效,这个配置会降低性能。默认:false(如果test-on-borrow为true,那么test-while-idle无效)
spring.emily.datasource.config.mysql.test-on-borrow=false
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。默认:true
spring.emily.datasource.config.mysql.test-while-idle=true
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。默认:false
spring.emily.datasource.config.mysql.test-on-return=false

3.2.2 修改conn改成局部变量

修改后的代码如下:

    private static Logger logger = LoggerFactory.getLogger(MysqlConfig.class);
    private static DataSource dataSource = null;//静态类变量
    private static Connection conn = null;
    
    //沙箱数据库
    private static final String URL =
            "jdbc:mysql://域名:端口号/数据库名?useUnicode=true&characterEncoding=utf8";
    private static final String USERNAME = "用户名";
    private static final String PASSWORD = "密码";

    public DataSource dataSource() {
        DruidDataSource dataSource = null;
        dataSource = new DruidDataSource();
        //dataSource.setDriverClassName(driverClassName);//如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
        dataSource.setUrl(URL);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        dataSource.setValidationQuery("SELECT 1");// 用来检测连接是否有效 防止连接断开
        dataSource.setTestOnBorrow(true);//借用连接时执行validationQuery检测连接是否有效。每次打开链接
        dataSource.setTestOnReturn(false);//归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        //连接空闲时检测,如果连接空闲时间大于timeBetweenEvictionRunsMillis指定的毫秒,执行validationQuery指定的SQL来检测连接是否有效
        dataSource.setTestWhileIdle(true);//如果检测失败,则连接将被从池中去除
        dataSource.setTimeBetweenEvictionRunsMillis(1000 * 5);//5秒钟 TODO DBA反馈看数据库日志没生效 
        dataSource.setMaxActive(20);
        dataSource.setInitialSize(5);
        return dataSource;
    }

    /**
     * @description: 获取dataSource信息
     * @author longxie
     * @date 2023/1/3 20:02
     * @version 1.0
     */
    public  Connection getConnection() throws SQLException {
        if (conn == null) {
            dataSource = dataSource();
            conn = dataSource.getConnection();
            conn.setAutoCommit(true);//自动提交
        }
        return conn;
    }

部署版本上线以后发现还是会出现连接超时的问题。经过同事代码CR发现conn不能声明成类变量。conn超时以后会变成close状态不是null。导致无法获得新链接。详情见下图:请添加图片描述

后面改写程序,把conn改成局部变量就OK了。后面做版本上线发现没问题。

	private static Logger logger = LoggerFactory.getLogger(MysqlConfig.class);
    private static Connection conn = null;
    private static DataSource dataSource = null;

    //沙箱数据库
    private static final String URL =
            "jdbc:mysql://域名:端口号/数据库名?useUnicode=true&characterEncoding=utf8";
    private static final String USERNAME = "用户名";
    private static final String PASSWORD = "密码";

    public static DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        //dataSource.setDriverClassName(driverClassName);//如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
        dataSource.setUrl(URL);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        dataSource.setValidationQuery("SELECT 1");// 用来检测连接是否有效 防止连接断开
        dataSource.setTestOnBorrow(false);//借用连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        dataSource.setTestOnReturn(false);//归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        //连接空闲时检测,如果连接空闲时间大于timeBetweenEvictionRunsMillis指定的毫秒,执行validationQuery指定的SQL来检测连接是否有效
        dataSource.setTestWhileIdle(true);//如果检测失败,则连接将被从池中去除
        dataSource.setTimeBetweenEvictionRunsMillis(60000);//1分钟
        dataSource.setMaxActive(20);
        dataSource.setInitialSize(5);
        return dataSource;
    }

    /**
     * @description: 获取dataSource信息
     * @author longxie
     * @date 2023/1/3 20:02
     * @version 1.0
     */
    public static Connection getConnection() throws SQLException {
        if (conn == null) {
            dataSource = dataSource();
            conn = dataSource.getConnection();
            conn.setAutoCommit(true);//自动提交
        }
        return conn;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 语法(空行、变量、if条件控制、循环语句)编码示例

文章目录前言python 语法(空行、变量、if条件控制、循环语句)编码示例1 空行,在python中空行也是代码2 单个变量赋值、多个变量赋值3 if条件控制4 循环语句4.1 while循环4.2 for 循环前言 如果您觉得有用的话,记得给博主点个赞,评论&#xff…

C++程序的编译与运行

C和C语言类似,也要经过编译和链接后才能运行。 下图是 C/C 代码生成可执行文件的过程: C源文件的后缀 C语言源文件的后缀非常统一,在不同的编译器下都是.c。C 源文件的后缀则有些混乱,不同的编译器支持不同的后缀,下…

新应用——设备巡检管理,系统化更具稳定性

对于生产制造型企业来说,随着企业逐步发展,产量增大,生产设备的稳定性和安全性就成为企业经济效益的关键。设备巡检是有效保证设备安全和稳定的重要环节。通过设备巡检,定期掌握各台设备的运行情况及周围环境的变化,尽…

算法竞赛百日——快速排序 - 分治

本文已收录于专栏 🌲《百日算法竞赛》🌲 目录 本文已收录于专栏 🌲《百日算法竞赛》🌲 快速排序 解题思路 ​ 思路分析: 模拟: AC_Code 二分查找 用二分法求 平方根 二分模板 快速排序 给定你…

纯前端导出Excel并修改样式

之前写过一篇前端导出:Vue实现导出功能(无后端配合) ,但是当时没考虑到样式的问题,后来要求导出的Excel单元格的样式也需要调整,尤其是宽度,第一想到的就是xlsx-style这个包,之前也没…

Python基础篇---生成器和模块

生成器对象 生成器对象其本质是自定义迭代器,就是需要我们自己写代码产生的迭代器。 生成器对象也是节省存储空间的 特性与迭代器对象一致。 def index():print(第一次输出)yield 1print(第二次输出)yield 2 1 2 3 4 5 6 7 8 9 10 当我们没有加括号调用之前&…

学习JavaScript,有哪些好的博客或者网站推荐?

前言 特意制作了一个Js整体的学习路线以及相关知识点博客讲解以及各类网站学习的资源整合,希望对你有帮助哈~ 废话少说,我们直接进入正题,先放上路线导图: 部分重要知识点 基础性知识 声明变量 null 和 undefined 详解JavaS…

code warrior IDE win10 64位安装保姆级教程

以下安装步骤是在win10 64位系统运行程序默认安装在C盘第1步:第2步:将PE_Plugin.dll文件复制到com文件夹中,路径如下:C:\Program Files(x86)\Freescale\CodeWarrior for Microcontrollers V6.3\bin\plugins\com第3步:以…

Blender里的三种绑定 (三)骨骼

文章目录Blender里的三种绑定.骨骼.骨骼基础.骨骼的父子关系.挤出骨骼.细分骨骼.骨骼分层.骨骼分组.骨骼约束.骨骼被遮挡.对称骨骼.为模型绑定骨骼.刚体物体,只跟随骨骼的移动,不随骨骼移动发生形变,如机械.软体物体,跟随骨骼的移…

手写RPC框架第7版-框架容错性相关设计

源代码地址:https://github.com/lhj502819/IRpc/tree/v8 系列文章: 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现基于线程和队列提升框架并发处理能力框架容错性相关设计通过SpringBoot-Starte…

数据结构:关于空间复杂度的例题计算

1、计算冒泡排序的空间复杂度 答案:该程序空间复杂度为O(1)。 解析:该程序在栈空间所申请的临时变量空间只有三个,也就是看成常数个,所以是O(1)。如下图所示 2、动态开辟N个数的数组空间复杂度 答案:该程序空间复杂度…

【UE4 第一人称射击游戏】31-更好的UI界面

素材资料地址:链接:https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg密码:jlhr上一篇:【UE4 第一人称射击游戏】30-简单的任务提示功能本篇效果:步骤:在UE中新建一个“HUD_Export”文件夹,将所…

《码出高效:java开发手册》七 - 并发与多线程

前言 现代CPU运算速度以百亿计,家用计算机和操作系统也是数十进程,数百线程,程序相应也需要采用多线程和并发的技术 并发和并行:并发是指某个时间段,多任务处理;并行是指同时处理多任务的能力;…

接口测试项目实战与经典面试题解析,挑战 BAT 大厂必会!

近年来,接口测试技术体系已在各大互联网企业落地普及,各种新接口框架不断涌现,业界也形成了不少成熟方案和成功案例。当前 BAT 大厂在招聘测试人员时,接口测试技能和项目经验是必考重点,直接影响到职级评定和薪资水平&…

2023/1/10 Vue学习笔记6 - 路由基本使用

1 路由的简介-router 1、路由就是一组key-value的对应关系。 2、多个路由,需要经过路由器的管理。 SPA (single page web application)应用 - 单页面web应用 {"key":"/class","value":"班级组件" }1.vue-rout…

kali中wpscan工具使用

一.wpscan工具简介 wpscan是一款专门针对wordpress的扫描工具,采用ruby语言编写,能够扫描worpress网站中包括主题漏洞、插件漏洞以及wordpress网站本身存在的漏洞。wpscan还可以扫描wordpress网站启用的插件和其他功能。 在Kali Linux系统中&#xff0…

关于distinct——去除重复记录

distinct译为:不同的,有区别的;在SQL语句中表示去除重复记录的意思 举例:在员工表emp中查询所有的工作岗位。 分析:在员工表中的工作岗位字段下有重复的工作岗位,我们在查询的时候就希望将重复的工作岗位显…

数据库取证——MySQL基础知识

目录 一、数据库基础知识 (一)数据库(DB) (二)数据库管理系统(DBMS) (三)数据库系统(DBS) (四) 数据库的…

【Unity云消散】简单理论基础:实现边缘光

写在前面 既然想要实现云的消散效果,那么边缘光如何计算也是一个重点。 在Unity Shader入门精要的14章,介绍轮廓线渲染就介绍了——轮廓边检测,而边缘光也是需要先检测出轮廓边再进行的。 Unity3D Shader系列之边缘光RimLight 这篇博客给…

Go专家编程读书小记

文章目录协程进程和线程进程:进程间通信:线程:区别:协程GMP模型调度策略内存管理内存分配span:cache:central:heap:垃圾回收常见的垃圾回收算法:三色标记:垃圾…