栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

日常开发问题记录,堆溢出,连接失效

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

日常开发问题记录,堆溢出,连接失效

项目场景:

项目场景:定时任务同步第三方数据,使用JDBC连接第三方数据库进行同步数据


问题描述

例如:在开启同步时,由于是并行执行,导致堆溢出,后改分页,由于数据过多造成数据库连接失效:
SQLNonTransientConnectionException: (conn=6620) unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.
Connection com.mysql.cj.jdbc.ConnectionImpl@67f0bcf4 marked as broken because of SQLSTATE(08S01), ErrorCode(0)
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

原因分析:

例如:看了下数据库中数据,大概总数据在40万条数据,项目分配运行内存为1G。代码中大量创建list集合接收和转换对象,使用完之后没有clear(),方便jvm更快执行垃圾回收,导致一瞬间内存溢出,而且代码大量使用反射,逻辑执行复杂,导致线程消耗内存过大




解决方案:

提示:这里填写该问题的具体解决方案:

例如:因为使用的JDBC,用的c3p0连接池,修改连接池配置参数,每获取连接就检查一次数据库连接是否正常,保证连接的可用性。一次查询改为分页查询,去除多余的集合,方法执行完,把集合进行清除。


ps: 在分页查询时,使用了com.google.common 工具类Lists.partition进行分组落库
落库完成之后进行情况,此时直接 partition.clear()会报错,进行循环遍历,添加终止条件,此时会把分组的list也会清空

c3p0连接池配置:
参考 -> https://www.cnblogs.com/shqblogs/p/5582177.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002780.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号