在线考试优化总结.pptVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在线考试优化总结

实训平台在线考试优化总结 原有程序存在的问题: 1.首次加载试卷时,要从数据库中进行查询,然后加载,加载速度较慢。 2.action每次都把整个试卷作为参数进行传递,传递数据量较大,影响出题速率。 3.action取试卷参数时,都要先从数据库中查询一个关联对象,然后通过这个对象加载试卷参数。(每次出一个题都要和数据库交互一次,速度较慢) 4.考试页面的jsp里包含了无用的JavaScript库文件,导致页面加载数据量在124K左右。 问题一解决方案 加载试卷时不再查询数据库,直接从内存中加载。利用spring的定时器功能,把第二天要考试的试卷内容提前加载到内存中。具体做法是把试卷内容放到一个Map中,key为试卷id,value为试卷内容。当考试开始时,可以根据试卷id这个参数从Map中加载试卷。 另外考虑到定时器运行完后,当天有新发布的考试,在点击发布按钮时,也把这个考试内容加载到内存中。(注意事项:定时器运行时需要先把前一天的内容清空,然后再加载试卷内容。) 问题二解决方案 试卷参数包含了众多的试题和选项,数据量较大,因此取消试卷参数 传递,把试题作为参数进行传递,每次只加载一个试题。 问题三解决方案 在加载试卷时,初始化试卷参数的内容,把这个参数放到session中去,每次出下一题时,先从session中取试卷内容,然后根据题号得到下一题。 注意事项: 页面操作每点下一题时,hibernate的session都对一个试卷对象做save()操作,把上一题所选答案存入数据库。这时的试卷对象变为持久态,再放入HttpSession中做操作可能有各种问题,这时需要用一个值对象Vo把试卷参数的所有内容拷贝进去,然后把这个Vo放入HttpSession中。 问题四解决方案 删除jsp文件中无用的JavaScript函数库引用,页面数据传递量从124K降到25K左右。 MySQL数据库问题 压力测试时使用MySQL的InnoDB引擎做Insert操作,当并发量超过208很容易出现死锁问题。查阅相关资料后得知: 在innodb源代码lock/lock0lock.c文件中,定义了两个常量: ? /* Restricts the length of search we will do in the waits-for graph of transactions */ #define LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK 1000000 /* Restricts the recursion depth of the search we will do in the waits-for graph of transactions */ #define LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK 200 ? 然后在检查是否产生死锁的函数lock_deadlock_occurs()中有如下代码: ? ret = lock_deadlock_recursive(trx, trx, lock, amp;cost, 0); switch (ret) { case LOCK_EXCEED_MAX_DEPTH: 产生死锁 ... break; } 其中的lock_deadlock_recursive()函数是递归函数,它会检查自身递归深度,其中有如下代码: ? ibool too_far = depth LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK || *cost LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK; ... if (too_far) { return(LOCK_EXCEED_MAX_DEPTH); } 因此innodb在检查是否产生死锁时调用lock_deadlock_occurs()检查,这个函数再会调用lock_deadlock_recursive()递归检查锁的数目(不知道这么说是否确切?),当递归的深度depth大于了一开始介绍的常量LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK,或者cost(不清楚这个代表什么)大于一开始介绍的常量LOCK_MAX_N_STEPS_IN_DEADLOCK_CHECK时,就认为发生了死锁. 在mysql 5.1.22中,已经改良了Innodb的auto_increment的锁机制,增加了一个inno

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档