热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaweb性能优化题目_javaweb项目优化记录:优化考试系统

考试系统在进行压力测试时发现,并发量高之后出现了按钮无反应,试题答案不能写到数据库的问题,于是针对这些核心问题,进行了优化。

考试系统在进行压力测试时发现,并发量高之后出现了按钮无反应,试题答案不能写到数据库的问题,于是针对这些核心问题,进行了优化。

数据库方面:

Select语句:Select * from TEB_VB_XZTRecord改为select必须的列form TEB_VB_XZTRecord,之前看的教学视频里就讲过最好别用*,由于查询了不必要的列,所以导致了低效率。

insert优化:考试业务的原因,需要把查询出来的试题,一条条的插入到数据库中。优化前:循环+每次插入一条的insert语句。优化后:insert 表名(字段名) select (字段名) from 表名 where questionID in(,,,,,,,)

这种优化在insert语句中用了select字句和in关键字,相当于在数据库执行了查询之后,直接进行了查询,没有通过java项目的一次次的循环。之前想用一个insert+多个value的方法,发现这种方式在mysql中行的通,但在oracle中行不通。

程序设计和算法优化:

算法经常受个人思路的影响,比如对复用认识深刻,干过的事情就把成果保存下来,以后再用就高效了。程序设计也是一样。

缓存相同数据

考生的考试卷面,需要由考试信息、个人信息,考试卷面分值分布,试卷内容 四块内容组成,其中考试信息和卷面分值分布 对每个考生都相同,因此将相同的信息进行缓存,就减少了大量的查询,而不是用一次查一次。

提前谋划,提前准备

在大并发量时,可以提前干的事就提前干,就像请人在自己家吃饭,到了吃饭的点临时准备饭菜,肯定手忙脚乱,提前准备出来到时候就悠闲了。

对于考试系统的抽卷来说:考生考试时,每个考生都随机从题库抽取一套试卷。这种方法包含了大量的查询和一个循环,因此对性能要求较高,并且大并发量时导致了系统根本没反应。

第一次优化:在考试前为考生抽好试卷,考生登录时只需从答题记录表查询即可,这样是把抽题的过程提前准备好了。

第二次优化:考虑到第一次优化中扔需要大量的查询,这次优化的逻辑是 抽取固定的卷数,比如抽取50套,每套卷有一个卷号,考试前将50套卷加载到内存中,考生随机抽取到一个卷号,然后根据卷号从内存中拿试卷,这样只要查询一次,然后其他考生都可以从内存中获取试卷,避免了大量的查询。

将事情分开干

非常忙的时候,把可以后推推的事情推后点,合理规划好资源和时间。答卷过程中,将客观题判分的环节移到了教师判分逻辑中,因为正确答案需要查询,所以在答题时会同时有大量的查询和更新操作,去掉了判分,答题时就只有更新了。

再有就是对String的优化,因为考试系统需要将试题显示在界面,因此需要在后台将试题拼好串,显示在前台,当时用了String,但String不是动态扩容的,只会复制原来的String,加上新内容后新生产一个。因此存在着大量的存储浪费,改为了StringBuffer以后,对内存的要求小了很多。

原文:http://blog.csdn.net/xqf309/article/details/35553247



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
author-avatar
翟厉害
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有