文章目录

  • 自我介绍
  • 泛型设计数据库的优点?采用泛型设计数据库的原因?
  • 前后端分离时,接口和Session/Cookie跨域问题
  • postman采用post传输方式时,传输JSON数据与传输form表单数据的区别
  • get和post传输方式的区别?实质上有没有区别?
  • 拦截器和过滤器的区别?
  • springboot的原理和机制?
  • HashMap了解吗?hash算法了解吗
  • NIO了解吗?
  • 这么多种类型的题目,是用一个表存储吗?为什么不?怎么存储这些题目的?这样存储有什么好处?
  • 怎么随机抽取阅读题、选择题等题目?为什么question表里存储的是一整道大题的题目?
  • 考试的时候,会有很多学生,有没有遇到高并发问题?怎么解决高并发问题?
  • Answer表里怎么存储学生答案?
  • 课程之间想共享资源和考试怎么办?
  • 由谁来建立课程组?“权限(权限模块、权限点)-角色-用户”是什么意思?怎么设计的,拦截器里如何实现权限?
  • 生成试卷的时候,抽取题目数目不够时,怎么办?为什么会抽不够?

自我介绍

  黄军威,本科和硕士期间就读于中国石油大学,一所普通的211院校。就读学院是计算机与通信工程学院。毕业时间是2020年6月份。
  本科时参加过ACM决赛,三年的本科暑期实习让他越来越喜欢编程。
  读研期间:学术上写了两篇SCI,研究方向为复杂网络之链路预测;项目上,主攻Java后端,写过jsp和html。参与研发过两个真实项目,分别是:“英语考试系统”、“实验云课堂”。利用空闲时间学习的练手项目——“电商秒杀系统”项目。
  通过真实项目和主动学习,积攒了一定程度的做项目能力,现在有了一定的需求分析与设计能力、底层数据库设计能力、从前端后端数据库等方面构思开发设计文档能力、编程能力、处理高并发经验、数据库优化能力。
总之:人要不断学习,不断向前进步。
性格:非常负责任,能承受住压力。

泛型设计数据库的优点?采用泛型设计数据库的原因?

优点:
1)范式化的数据库更新起来更加快;
2)范式化之后,只有很少的重复数据,只需要修改更少的数据;
3)范式化的表更小,可以在内存中执行;
4)很少的冗余数据,在查询的时候需要更少的distinct或者group by语句。

缺点:
1)范式化的表,在查询的时候经常需要很多的关联,因为单独一个表内不存在冗余和重复数据。这导致,稍微复杂一些的查询语句在查询范式的schema上都可能需要较多次的关联。这会增加让查询的代价,也可能使一些索引策略无效。因为范式化将列存放在不同的表中,而这些列在一个表中本可以属于同一个索引。

前后端分离时,接口和Session/Cookie跨域问题

什么是跨域?导致跨域问题的底层原因是什么?怎么解决?

postman采用post传输方式时,传输JSON数据与传输form表单数据的区别

json传输的一定是对象,form表单传输的可以是对象,也可以是普通变量类型

get和post传输方式的区别?实质上有没有区别?

基本区别:
(1)GET请求的参数是放在URL里的,POST请求参数是放在请求body里的;
(2)GET请求的URL传参有长度限制,而POST请求没有长度限制;
(3)GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制;

本质上是没有区别的:
(1)他们都是HTTP协议中的请求方法。底层实现都是基于TCP/IP协议。上述的所谓区别,只是浏览器厂家根据约定,做的限制而已。HTTP请求,最初设定了八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。
(2)GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
(3)在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
(4)GET和POST还有一个重大区别:GET产生一个TCP数据包;POST产生两个TCP数据包。

  1. 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
    而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
  2. 也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
  3. 因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
  4. GET与POST都有自己的语义,不能随便混用。
  5. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  6. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

拦截器和过滤器的区别?

(1)过滤器(Filter):依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。
(2)拦截器(Interceptor):依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
(3)过滤器的运行是依赖于servlet容器,跟springmvc等框架并没有关系。并且,多个过滤器的执行顺序跟xml文件中定义的先后关系有关。
(4)运行原理

————————————————————————————————————
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
————————————————————————————————————
1.过滤器和拦截器触发时机不一样:
  过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
2.过滤器和拦截器触发时间和地点不一样:
  过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
3.过滤器和拦截器触发时间和地点不一样:
  过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前
————————————————————————————————————
总结:
(1)拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑。
(2)总结:过滤器包裹住servlet,servlet包裹住拦截器。

springboot的原理和机制?

HashMap了解吗?hash算法了解吗

hash算法和HashMap详解:https://blog.csdn.net/xu_dongdong/article/details/80251936

NIO了解吗?

BIO编程:
https://blog.csdn.net/qinshi965273101/article/details/81516574
NIO编程:
https://blog.csdn.net/qinshi965273101/article/details/81676145
NIO编程:
https://www.jianshu.com/p/507ca8048ef4
https://www.jianshu.com/p/ea264ed5b12f
https://blog.csdn.net/qincidong/article/details/82682871

这么多种类型的题目,是用一个表存储吗?为什么不?怎么存储这些题目的?这样存储有什么好处?

怎么随机抽取阅读题、选择题等题目?为什么question表里存储的是一整道大题的题目?

/** 根据大题小题要求,从question表中抽取题目,得到所有题目的id和其他信息。* 1.JOIN表t2 :round() * [*                          随机数 * (计算question表的总行数 - 最终要出几道这种类型的小题)*                          +*                          question表的最小id*                        ]* 2.where条件:题库id相符,题目类型相符,每道小题选几道小小题相符,t1.id >= t2.id* 3.limit限制返回的数量** 拓展:另外,limit可以做分页* */@Select("select t1.* from question as t1 " +"JOIN " +"(SELECT round( " +"rand() * ((select COUNT(id) from question) - #{numberFinalQuestion}) " +"+ " +"(select MIN(id) from question) " +") as id ) as t2 " +   //Join表t2"where question_bank_id in (#{questionBankList}) and type = #{type} and number_sub = #{numberSub} and t1.id >= t2.id " +"ORDER BY t1.id ASC LIMIT #{numberFinalQuestion}")List<Question> getQuestionRoughInf(ExamRandSection examRandSection);

考试的时候,会有很多学生,有没有遇到高并发问题?怎么解决高并发问题?

这几个场景出现了高并发问题:
(1)考试开始时,学生请求试卷,后台要从数据库中抽取试卷(question表的id)给缓存,然后把试卷的具体信息获取出来发给考生,同时在缓存中设置学生对每个小题的作答为空;
(2)考试时,学生每做一道题就要提交给后台缓存(为什么?为了防止学生浏览器或者手机突然退出,下次进入时仍能够继续作答,看到以前的作答情况);
(3)考试时,这么多学生,不可能每提交一道题就去更新数据库,所以用redis缓存学生提交的每个小题的答案;(之前想过两个方案:第一个方案:建立一个临时表,专门用来在考试时存储学生提交的答案,优点是:不用遍历整个answer表,缺点是考试时更新MySQL还是太慢;第二个方案是:在本地用ConCurrentHashMap缓存答案,但是本地缓存数据存在缺点:项目需要重新启动或者转移服务器时,缓存中的数据不能转移;另外项目工期有限,本人有可能没法在短时间内解决内存溢出与内存泄漏的问题)
(4)考试时,使用了jedis——redis的连接池
(5)考试后,将缓存中的数据持久化到MySQL中。(怎么触发这个事件?即怎么知道考试时间到了?)

Answer表里怎么存储学生答案?

在数据库方便进行了优化:
(1)之前是在数据库里存储了每场考试每个学生提交的每个小题的答案,缺点:需要很多行存储一个学生某场考试的答案,这样导致answer表的行数翻了很多倍,想要查询某个题时需要遍历的行数变多。
(2)之后,直接用一行存储学生在某场考试中的答案,字段里存储的是答案对象序列化后的字符串。优点:行数大幅度减少,缺点:查询出某次考试后需要反序列化成对象。
总结:(1)是给数据库增加了压力,(2)是给后端增加压力。

课程之间想共享资源和考试怎么办?

建立课程组

由谁来建立课程组?“权限(权限模块、权限点)-角色-用户”是什么意思?怎么设计的,拦截器里如何实现权限?

建立课程组属于某些用户的权限,而权限由超级管理员配置,超级管理员可以配置其他类型的管理员,不同类型管理员拥有不同权限,比如“建立课程组管理员”有建立课程的权限;“教师管理管理员”有增删改教师信息的权限。

生成试卷的时候,抽取题目数目不够时,怎么办?为什么会抽不够?

  1. 抽取题目数目不够时,就写循环抽5次,如果5次里面有任何一次抽够了,就中段循环;如果5次中没有任何一次抽够,则循环结束,并抛出异常“抽题数目不够”。
  2. 因为项目比较紧急,没有时间去深入了解为什么会抽不够,感觉是数据库本身有一个我不知道的问题。

英语水平测试项目----总结遇到的问题相关推荐

  1. 英语水平测试项目(黄军威、殷乐乐、张益维20180531)

  2. 关于复旦大学英语水平测试和计算机应用能力水平测试成绩记载事宜的说明,复旦大学水平测试(FCT、FET)近期通知概览 | 一周复旦热问...

    原标题:复旦大学水平测试(FCT.FET)近期通知概览 | 一周复旦热问 复旦大学水平测试 就是我们大家常说的 复旦大学计算机应用能力水平测试(FCT) 和复旦大学英语水平测试(FET)的统称啦 春寒 ...

  3. TJOJ 1101 软件工程师英语水平测试

    题目描述 在新格尔软件公司有一个有趣的考试,名字叫做软件工程师英语水平测试,每年有两次,分别在每年的8月17日和12月的第一个星期六举行.菜哭文是刚刚入职的一名软件工程师,他给自己定了一个小目标,要在 ...

  4. 深大计算机专业英语笔试,深大新生入学英语水平测试考什么?英语渣看完瑟瑟发抖......(附3套模拟题)...

    原标题:深大新生入学英语水平测试考什么?英语渣看完瑟瑟发抖......(附3套模拟题) 来源:本文综合自深大考试君,如果有侵权,请及时联系管理员处理. 随着一本二本的招生结束,深大又迎来了一批优秀的新 ...

  5. 关于复旦大学英语水平测试和计算机应用能力水平测试成绩记载事宜的说明,复旦英语水平测试...

    复旦英语水平测试 一.根据<复旦大学2011级本科教学培养方案>,从2011年起,新增"复旦大学英语水 平测试(Fudan English Test)"和"复 ...

  6. 江苏高中计算机考试成绩查询系统,江苏2018普通高中信息技术学业水平测试成绩查询系统已开通...

    出国留学高考网为大家提供江苏2018普通高中信息技术学业水平测试成绩查询系统已开通,更多高考资讯请关注我们网站的更新! 江苏2018普通高中信息技术学业水平测试成绩查询系统已开通 点击下面图片即可进入 ...

  7. 伦敦网约车新规:须通过英语水平考试

    看来国外的网约车也有不少奇葩的规定. 据外媒报道,伦敦交通局(TfL:Transport for London)本周出台一项新规,要求那些在伦敦从事客运服务的Uber司机,在上岗之前必须先通过一项英语 ...

  8. 英语教学 计算机专业 高校,[高校计算机辅助普通话水平测试下的教学新模式]《计算机专业英语》pdf...

    摘 要: 计算机辅助普通话水平测试近几年已经在全国高校普遍实行,与传统的人工测试相比,它是一种全新的普通话水平测试方式,具有测试信度强.测试效率高.测试过程简化等特点,但也导致在普通话教学中和测试中出 ...

  9. 学习人工智能必须攻克三道门槛:数学基础、英语水平与编程技术

    来源:搜狐 广义的说,人工智能包含诸多不同方法,其主旨是让程序像一个智能体一样解决问题.机器学习是实现人工智能的一种方法,它不完全依靠预先设计,而是从数据中进行总结,达到模拟记忆.推理的作用.包括诸如 ...

最新文章

  1. Linux I2C工具查看配置I2C设备【转】
  2. JavaScript 正则表达式的使用
  3. python知识:@classmethod和@staticmethod的异同
  4. torchvision中Transform的normalize
  5. WPS关于尾注的细节
  6. 作为刚開始学习的人应该怎样来学习FPGA
  7. 神经网络全连接层详解
  8. 自定义对象和json互转
  9. 260.只出现一次的数字III
  10. 视频教程-VBScript脚本语言编程与自动化运维操作学习篇-其他
  11. 【清华大学】操作系统 陈渝 Part2 —— 中断、异常和系统调用
  12. 【2022年二级Python】②基本数据类型
  13. 叶俊在深圳天长地久集团培训会上谈到“唤醒沟通力与工匠精神”
  14. 4/17 腾讯广州微信客户端开发一面
  15. win10家庭版桌面软件图标左下角箭头删除
  16. 华为OD机试真题 Java 实现【猜字谜】【2023Q1 100分】
  17. Delphi中的线程类Thread
  18. 玩转内网穿透(1):内网穿透是什么?有什么用
  19. SSM框架搭建思路及流程
  20. 开源项目车牌识别EasyPR的使用

热门文章

  1. 怎么把图片转gif表情包?
  2. 课外知识:人工智能简明入门学习指南
  3. 【源码阅读】【苦练基本功】Golang内置函数分析
  4. x86汇编_SHLD/SHRD双精度左右移指令_笔记49
  5. ai字母组合发音规律_使用和尚ai的俄语字母分类
  6. flow java.lang.IllegalArgumentException: Unable to create call adapter for
  7. C#连接数据库自动生成实体类
  8. 1375. 至少K个不同字符的子串
  9. Selenium WebDrive使用Edge浏览器模拟登录163邮箱
  10. 《IT通史》读后感一