面試總結--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字段)時才會發生查詢動作。
2)使用二級緩存, 二級緩存的應用將不怕1+N 問題,因為即使第一次查詢很慢(未命中),以後查詢直接緩存命中也是很快的。剛好又利用了1+N 。
3 ) 當然你也可以設定fetch="join",一次關聯表全查出來,但失去了延遲加載的特性。
面試總結--01