面试总结--01

昨天面试感觉技术不够好的样子,回答的太过于急躁,内心不够沉淀。总归来说还是内力不够深厚。

总结几个问题吧,感觉出现过而自己没有太过于重视。

1、get与post的区别

查找资料发现这个问题的答案还真是不太一样,每个人都有不同的说法,我就总结一些在面试中至少还说的过去的答案吧。

①:get请求时将请求参数放在URL地址栏后面,post请求将请求参数放在请求体中。

②:get请求一般用于向服务器请求数据,post请求一般用于向服务器发送数据。(关于这点我觉得还说的过去的,因为一般提交的数据涉及安全和数据量的时候会考虑到post方法吧,而关于get一般用于向服务器请求数据的原因看③④点)。

③:get请求浏览器会有数据缓存,这样在页面进行回退的时候不会再发送请求,post请求浏览器没有数据缓存,页面回退的时候会再一次发送请求。

④:get请求产生一次TCP数据包(HTTP Header + data得到服务器响应200则返回数据),post请求会产生二次TCP数据包(先发送header,服务器响应100,则继续发送data,服务器响应200,返回数据)。

⑤:get与post安全性上的差异。

2、n+1问题

关于这个问题,首先应该明白什么是n+1问题。

①:对于一对多,例如订单表和订单商品表。查询订单表时会自动关联每个订单的订单商品。这样查询订单时用掉了一条sql语句,查出了n条订单数据。然后hibernate会挨个找出n个订单对应的订单商品,又用掉n条sql语句,一共是n+1条。

②:对于多对一,同样是订单表和订单商品表。查询订单商品时hibernate会自动关联每个订单商品的订单。这样查询订单商品时用了一条语句,查出了n条订单商品。然后hibernate挨个找到每个订单商品的订单,又用掉了n条sql语句,一共是n+1条。

解决方案:

1)lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。(FetchType.Lazy)

2)使用二级缓存, 二级缓存的应用将不怕1+N 问题,因为即使第一次查询很慢(未命中),以后查询直接缓存命中也是很快的。刚好又利用了1+N 。

3 ) 当然你也可以设定fetch="join",一次关联表全查出来,但失去了延迟加载的特性。

原文地址:https://www.cnblogs.com/ZNwithLC/p/9582358.html