zoukankan      html  css  js  c++  java
  • 总结:大数据量更新锁表、数据库连接超时的问题

    *)问题背景:

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

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

            

  • 相关阅读:
    SharedPreferences介绍,用来做数据存储
    android中的回调简单认识
    git的使用
    Android Studio插件美化Android Studio,文艺清新范
    arp欺骗技术
    进程和线程的关系
    Win下常用命令大全
    JavaWeb系列之:Servlet
    JavaWeb系列之:监听器
    JavaWeb系列之:过滤器
  • 原文地址:https://www.cnblogs.com/mySummer/p/14815059.html
Copyright © 2011-2022 走看看