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


    *)问题背景:

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

      出现的问题:更新数据库的时候,为了减少连接数据库的次数,在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.分批更新,减少行锁的可能,减少数据库占用时间

            

  • 相关阅读:
    物理材质
    铰链joints
    unity 刚体
    扩展方法
    转换操作符方法(非基元类型转换)
    向方法传递可变数量的参数
    参数:可选参数和命名参数
    实例构造器与值类型和引用类型、类型构造器
    成员的可访问性,友元程序集,静态类
    如何删除github上项目的文件
  • 原文地址:https://www.cnblogs.com/mySummer/p/14815059.html
Copyright © 2020-2023  润新知