问题介绍

最近在给学校做的一个项目中,有一个功能涉及到考核分数问题。

我当时一想,这个问题并不是很难,于是就直接采用了这样的方法:拿着一个表中的数据作为索引,去挨个遍历相关表中的数据,最后经过算分的过程,直接在算分函数中将算出的分数直接写入数据库,这就导致了标题说的问题。

解决过程

这个问题出现的现象是这样的:我从数据库中读取出来的作为索引的数据共有2000多条,使用增强for循环将数据传入算分的方法中。但是后来发现,算出分数的数据总计也就300多条,本以为是这条作为索引的数据在其他表中没有相关的数据造成的分数为0,后来发现,即使是在其他表中有数据的,算出的分数依旧是0。

这个问题着实令人费解,本以为是增强for循环的线程安全问题,后来就将增强for循环改成了迭代器,但是这个问题依旧没有解决。

紧接着,我想了想,开始测试一下这条分数为0的数据是否被读入了函数当中,于是我在算分的函数中设置了个判断条件,结果发现,这条数据真的是没有被读入函数。

无奈之下,只能是一点点debug,我将传入的参数改成了数据表中没有分数的这条数据的,居然发现这条数据能够被成功计算出分数。

这时候我整个人已经是懵逼的了,我不禁在想,为什么会出现这种情况?单独将值传入函数,可以计算出分数值,但所有数据一起读写,就会出现这个问题呢?

此时我已经坐在电脑前debug了一个下午,晚饭也没有吃,本来中午就应该上线的功能,硬是到了晚上依然没有被解决,确实有点慌了。

无奈之下只能是请教之前负责这个项目的学长,但是学长有课,只能等到八点半。在等待期间,我依旧是在疯狂的debug,真的是一点头绪都没有。

学长来了之后,他在循环的过程中加入了一个计算次数的变量,每次输出一下,结果发现,程序并没有执行完成,总是执行到第420次就停了,期间没有任何错误信息,没有任何其他异常,诡异的很。

不过这个时候我们已经意识到了是mysql数据库的问题。

就这样,学长和我们一起一直盯到了两点,之前已经将分数采用一次读取几百条数据的方式成功将分数算出来交给学校科研院处理了。

随着学长一个激动的叫声,问题总算是得到了解决!

最终的解决方案

原来,在我设计的方法中,是读写同时进行的。

虽然第一次将数据读到一个集合中了,但是每次循环都会再次从数据库中读取大量的数据,数据的条数超过了几万条,这还不算,在每次读取后,计算出分数,会将分数直接写入数据库,就这样,在频繁的与数据库进行读写操作的时候,mysql不干了,直接将这个表锁住了。

这也解释了为什么系统的其他的功能可以使用,偏偏和分数相关的功能都不能用的问题。

于是最终将写入分数的步骤单独拿了出来,这样子,成功的将所有数据的分数都算了出来。

持续了超过十个小时的过程中,终于将问题解决了。

经验教训

经过这次惨痛的教训,使我深刻明白了一个问题,下次再设计方法的时候,一定要将读写操作分开进行,否则就会出现十分严重的问题。

虽然整个过程困难无比,但还是收获巨大的,这种感觉真的特别好。

我想以后真的不可能会忘记读写分离这件事情了,哈哈!

谢谢帮忙的学长还有同学!

结语

想了解更多的专业知识、前瞻信息、技术文章吗?那么请我的个人公众号:进击的程序狗,一起进步!

mysql数据库大规模数据读写并行时导致的锁表问题的更多相关文章

  1. 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作

        为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...

  2. 使用python将mysql数据库的数据转换为json数据

    由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ...

  3. 读取mysql数据库的数据,转为json格式

    # coding=utf-8 ''' Created on 2016-10-26 @author: Jennifer Project:读取mysql数据库的数据,转为json格式 ''' import ...

  4. mysql数据库主从同步读写分离(一)主从同步

    1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做?  不往从服务器去写了 ...

  5. CentOS6 更改Mysql数据库的数据存放位置

    mysql使用yum安装时,默认的数据是存储在/var/lib/mysql下.一般情况下,为了数据的安全性,建议将mysql数据库的数据文件存储在系统的第二块磁盘上的目录下可以按照以下步骤进行操作: ...

  6. mysql数据库delete数据时不支持表别名

    今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELETE FROM LEAD_SYSTEM_MENU_ORG_REF as t WHERE t.resourceid='4 ...

  7. 转】mysql数据库delete数据时不支持表别名

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4012853.html 感谢! 今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELE ...

  8. 在mysql数据库中创建oracle scott用户的四个表及插入初始化数据

    在mysql数据库中创建oracle scott用户的四个表及插入初始化数据 /* 功能:创建 scott 数据库中的 dept 表 */ create table dept( deptno int ...

  9. Loadrunner脚本优化-参数化之关联MySQL数据库获取数据

    脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1.   安装MySQL ODBC驱动程序 O ...

随机推荐

  1. Js获取页面地址参数

    var url = window.location.href; //获取当前窗口的Url; 结果:http://localhost:61768/Home/Index?id=2&age=18 v ...

  2. netty权威指南学习笔记一——NIO入门(3)NIO

    经过前面的铺垫,在这一节我们进入NIO编程,NIO弥补了原来同步阻塞IO的不足,他提供了高速的.面向块的I/O,NIO中加入的Buffer缓冲区,体现了与原I/O的一个重要区别.在面向流的I/O中,可 ...

  3. python 定义一个空集合、空字典

    s = set() #定义一个空集合 s = {} #定义一个空字典

  4. “战疫”需求不再等-京东云与AI【应急资源信息发布平台】召集开发者共同支援

    截止北京时间 2020年2月5日19时00分,全国确诊新型冠状病毒肺炎24423例,疑似23260例. 新年伊始,一切都显得和往年有那么一点不一样.疫情牵动着每一个人的心脏,也有很多人早就放弃了假期投 ...

  5. mysql 深度分页

    mysql  分页查询使我们常见的需求 ,但是随着页数的增加查询性能会逐渐下降,尤其是到深度分页的情况.我们可以把分页分为两个步骤,1.定位偏移量,2.获取分页条数的 数据. 所以当数据较大页数较深时 ...

  6. lastz

    lastz sequence1.fasta sequence2.fasta 其中,sequence1.fasta是reference genome :sequence2.fasta是需要比对的geno ...

  7. 编程入门-Java开发工具介绍及Eclipse安装

    编程入门-Java开发工具介绍及Eclipse安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java开发工具介绍 "源代码"一般是文字,所以可以使用记 ...

  8. ES6 - 装饰器 - Decorater

        注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时.这意味着,修饰器能在编译阶段运行代码.也就是说,修饰器本质就是编译时执行的函数.   修饰器是一个对类进行处理的函数.修饰器函 ...

  9. win10安装centOS 失去win启动项

    联网:执行以下三条命令 yum -y install epel-release yum -y install ntfs-3g grub2-mkconfig -o /boot/grub2/grub.cf ...

  10. java课程课后作业190530之找水王

    从题目中我们可以看出,水王有着相当严苛的条件才可以成为,那就是必须拥有一半的评论量才可以当上水王.当然这就是破题的关键,最简单的算法当然是用O(N平方)的复杂度的那种算法,但显然,我们需要的不是这种. ...