日常开发运维问题处理总结 一

一、尽可能少的事物颗粒度

异常:com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

常见度:❇️❇️❇️

这通常是由于事务锁超时或锁冲突引起的。这个错误表示某个事务在等待其他事务释放锁定资源的时间超过了预设的超时时间。

以下是一些处理该问题的方法:

  1. 调整超时时间:可以尝试增加超时时间,以便让等待锁定资源的事务有更多的时间来等待。你可以通过修改 MySQL 配置文件中的 innodb_lock_wait_timeout 参数来调整超时时间。适当增加这个值可能会减少锁等待超时的概率。

  2. 优化事务操作:检查并优化你的事务操作,确保每个事务只持有必要的锁,并且尽可能快速地完成事务操作。锁定的范围越小,事务执行的时间越短,就能减少锁冲突和锁等待的可能性。

  3. 检查索引:确保表上使用了适当的索引来支持事务操作。缺乏或不正确的索引可能导致查询需要扫描整个表或大量的行,从而增加了锁定的风险和时间。分析查询语句和数据访问模式,并根据需要创建或优化索引。

  4. 分析锁冲突:通过使用 MySQL 提供的锁相关的工具和命令,如 SHOW ENGINE INNODB STATUSINNODB_LOCKS 表,来分析锁冲突和等待情况。这样可以帮助你确定哪些事务在产生冲突,并找到解决冲突的方法。

  5. 调整并发控制策略:如果上述方法无法解决问题,你可能需要考虑调整应用程序的并发控制策略。例如,可以采用更细粒度的锁定策略,使用乐观并发控制或分布式锁等机制来处理并发访问。

排查处理:

1. 事物超时时间检查:

2.事物范围异步队列减少并发:

3、4、5:缺失关键字段索引添加,sql优化

二、新增业务优先考虑异步处理

常见度:❇️❇️

问题排查:

调用服务方只有一次调用日志, 数据分析每次数据间隔30s校固定,不是误操作等原因引起。定位feign重试机制导致。

Feign接口调用的重试行为受到Ribbon和Feign本身的配置影响。您可以通过适当地配置Ribbon和使用@Retryable注解来控制重试次数、超时时间和重试间隔等参数,从而影响Feign接口调用的重试行为。

当发生读取超时时,如果Feign请求由于连接错误或超时而失败,Ribbon将尝试重试该请求。首先,它会尝试重新连接当前服务器(MaxAutoRetries次数限制),如果仍然失败,则会切换到下一个可用的服务实例并重试(MaxAutoRetriesNextServer次数限制)。

修改异步调用或添加接口幂等性校验

在原有业务,添加新逻辑,优先考虑异步处理。 异步处理优先考虑使用消息队列,再考虑使用异步线程池,最后考虑异步线程。

三、数据查询尽量保证数据量

常见度:❇️❇️

这个sql全量查询,查询百万数据量,同一个list集合对象引用会一直存在,较长时间存在且经过多次垃圾回收后仍然存活的对象,存入old区,只能通过full-gc处理,而full-gc导致服务不可用。

以下是一些可能导致数据存放在老年代的原因和解决方法:

  1. 内存泄漏:如果您的代码存在内存泄漏问题,即使用完数据后未及时释放,并且该数据长时间存在于堆中,垃圾回收器无法回收它们。检查代码,确保适时释放不再使用的数据或对象,避免内存泄漏。

  2. 业务处理算法优化:如果业务处理时长与数据量成正比,可能需要考虑优化算法以提高处理效率。通过降低时间复杂度、减少循环次数等方式来改进算法,从而减少处理时长,减轻内存压力。

  3. 分批处理:如果一次性处理大量数据导致内存溢出或频繁触发垃圾回收,可以考虑将数据分批处理。将数据分割成合理大小的批次,每次处理一部分数据,处理完后释放相关资源,以减轻内存压力。

  4. 内存设置调优:根据实际需求和硬件环境,适当调整JVM的堆内存大小。通过-Xmx和-Xms参数可以设置最大堆内存和初始堆内存大小,合理配置可以提高程序性能和内存使用效率。

  5. 使用更高效的数据结构和算法:根据具体业务场景,选择适当的数据结构和算法,以减少内存占用和提高处理效率。例如,使用哈希表、红黑树等高效的数据结构,并考虑使用并发集合来提高多线程环境下的性能。

总之,要解决数据存放在老年代的问题,需要检查代码中是否存在内存泄漏,并进行算法优化、分批处理、内存调优和使用高效的数据结构和算法等措施。这样可以减少对老年代的使用,提高程序的性能和内存管理效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值