总结:⼤数据量更新锁表、数据库连接超时的问题
*)问题背景:
  从⼤数据量的表中,查出数据,做逻辑处理,之后,再更新回数据库。
  出现的问题:更新数据库的时候,为了减少连接数据库的次数,在mybatis⾥⽤<foreach>标签循环拼接了update语句。在执⾏这个update的时候,锁表了(mysql数据库)。
        为了解决锁表,在update的字段上加了索引,这样就不会整个表锁了,就算锁也是⾏锁。
        但是仍然会出现数据库连接超时,和更新速度特别慢的情况。前端页⾯迟迟拿不到更新结果。
  试着去解决的⽅法:
        上⽹查优化update SQL语句的⽅法,试图通过优化SQL来改善:将有点复杂的SQL优化到⽐较简单,之后,效果仍不明显。
*)解决⽅法:
        ①将这个操作开⼀个多线程,然后前端页⾯显⽰个下拉框,显⽰更新多少条剩余多少条。这样不影
响前端的显⽰,异步进⾏。
        ②发现慢的原因是:当时查询出错了,⽽且当时逻辑处理⾥⾯,⽤的2个for循环嵌套效率太慢,前端请求都断了。(也就是速度慢不仅仅是update语句的问题,逻辑处理的速率也太慢了)
        所以,改进内容是:
批量更新sql语句        多线程⾥做的事:把两个表的数据分别查询出来,得到两个集合,再把两个集合分别转成map ,两个表关联的字段作为map的key建对⽐得到⼀个新的集合(cList)(之前是把2个表的数据查出来,通过for循环再转换成⼀个list的,耗内存耗时间),再去把clist 每2000条为⼀批循环更新(分批更新,防⽌过多的量造成数据库连接断开。之前是把clist⼀起批量更新了。但是以后数据量⼤了这个慢还是解决不了,这只能治个标)。
*)问题总结:
        1.for循环分开为两个查询,减少内存消耗
        2.转换成map,加快匹配速度
        3.单独开线程,异步减少前端等待页⾯的时间
        4.分批更新,减少⾏锁的可能,减少数据库占⽤时间

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。