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

自我介绍

  黄军威,本科和硕士期间就读于中国石油大学,一所普通的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. 因为项目比较紧急,没有时间去深入了解为什么会抽不够,感觉是数据库本身有一个我不知道的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城有术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值