项目场景:定时任务同步第三方数据,使用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



