总结:大数据量更新锁表、数据库连接超时的问题

*)问题背景:

  从大数据量的表中,查出数据,做逻辑处理,之后,再更新回数据库。

  出现的问题:更新数据库的时候,为了减少连接数据库的次数,在mybatis里用<foreach>标签循环拼接了update语句。在执行这个update的时候,锁表了(mysql数据库)。

        为了解决锁表,在update的字段上加了索引,这样就不会整个表锁了,就算锁也是行锁。

        但是仍然会出现数据库连接超时,和更新速度特别慢的情况。前端页面迟迟拿不到更新结果。

  试着去解决的方法:

        上网查优化update SQL语句的方法,试图通过优化SQL来改善:将有点复杂的SQL优化到比较简单,之后,效果仍不明显。

*)解决方法:

        ①将这个操作开一个多线程,然后前端页面显示个下拉框,显示更新多少条剩余多少条。这样不影响前端的显示,异步进行。

        

        ②发现慢的原因是:当时查询出错了,而且当时逻辑处理里面,用的2个for循环嵌套效率太慢,前端请求都断了。(也就是速度慢不仅仅是update语句的问题,逻辑处理的速率也太慢了)

        所以,改进内容是:

        多线程里做的事:把两个表的数据分别查询出来,得到两个集合,再把两个集合分别转成map ,两个表关联的字段作为map的key建对比得到一个新的集合(cList)(之前是把2个表的数据查出来,通过for循环再转换成一个list的,耗内存耗时间),再去把clist每2000条为一批循环更新(分批更新,防止过多的量造成数据库连接断开。之前是把clist一起批量更新了。但是以后数据量大了这个慢还是解决不了,这只能治个标)。

*)问题总结:

        1.for循环分开为两个查询,减少内存消耗
        2.转换成map,加快匹配速度
        3.单独开线程,异步减少前端等待页面的时间
        4.分批更新,减少行锁的可能,减少数据库占用时间

        

原文地址:https://www.cnblogs.com/mySummer/p/14815059.html