1.一條sql語句的執行過程
2.按照5層來說吧
5層劃分的話分為實體層,資料鍊路層,網絡層,傳輸層和應用層。
實體層是最低部的一層,主要是用來傳輸比特,解決網絡中的異構問題。
資料鍊路層在實體層之上,他的作用主要是把資料封裝成幀,實作簡單的資料校驗功能。
網絡層中的主要協定是ip協定,主要是通過ip協定在網絡中去尋找ip位址對應的主機。
傳輸層兩大協定是TCP協定和UDP協定,提供了可靠傳輸和巨量傳輸兩種模式給上層,上層可以通過傳輸層中的協定進行端到端的資料傳輸。
應用層是最上面一層,主要是為了适配各式各樣應用的網絡子產品設計,比如浏覽器使用http協定和80端口,但其他應用的協定又不同,應用層就是為了不同應用而存在的。
3.如果伺服器在運作中cpu突然暴增怎麼排查
首先通過ps指令檢視一下占用cpu最多的程序,再根據請求選擇是否要殺死它還是用其他的解決方案。
然後通過stack工具列印Java的方法棧,檢視是否有死鎖的存在。
然後通過其他排查工具定位問題所在。如果是資料庫連接配接的的問題,就用復原政策解決。如果隻是單純的請求量暴增導緻的,那麼就先重新開機服務,并在以後的開發中多進行壓測。
4.想做一個線程安全的計數器,怎麼做
用AtomicInteger做,它底層使用的是Unsafe包中的方法,使用的是CAS操作來對資料進行修改。CAS是Java中一種輕量級鎖的實作,它在操作之前要判斷目标對象是否處于一個理想值,如果是則進行操作,如果不是就不會進行操作。在多線程的環境下,如果線程B對計數器做了修改,線程A在修改計數器時發現計數器已經不是自己理想的狀态了,就不會再把錯誤的值寫入了,這樣就能保證計數器計數的準确性。
5.比較一下MySQL和Oracle吧
首先是Oracle是基于使用者的,通過使用者去辨別資料庫,然後每個資料庫中有一些表。MySQL是一個使用者可以有多個庫,每個庫中又有很多表。Oracle和MySQL的SQL文法有差別,Oracle總體來說比較嚴格一些,而且它沒有limit的關鍵字,是以要分頁時麻煩一點。然後Oracle和MySQL的預設隔離級别不同,Oracle時讀已送出,MySQL是可重複讀。
這個問題回答的比較亂,大家可以看這個連結系統學習一下 MySQL與Oracle的差別
5.有資料庫優化的經驗嗎?說一下你的優化方案
資料庫優化分為幾個點:
首先是在建表過程中對表的設計和字段的處理方面要合理。比如要根據實際情況選用VARCHAR和CHAR,不要給字段過多寬裕的空間,如果表會膨脹的非常大,就盡量不要用外鍵,在後端中抽象出來一層去保證資料的完整性。
其次是索引優化,要根據表的實際使用情況選擇要不要使用索引,比如修改次數遠多于查詢的表就不适合用索引,維護索引帶來的開銷會大于使用索引帶來的優勢。建立索引時要根據不同需求建立不同的索引,比如要嚴格保證唯一性時就使用唯一索引。
接着是對SQL語句的優化,可以使用EXPLAIN關鍵字分析SQL語句執行的性能并去改善。還可以開啟慢查詢篩選出執行時間比較長的SQL語句進行優化。然後就是開啟查詢緩存,MySQL的資料庫整體上分為三層,一個查詢SQL語句到來時會先檢視是否有緩存可以使用,如果有的話就不會在向下去解析SQL,能省下很多性能開銷。
然後就是對資料庫表的拆分,可以根據業務選擇的橫向拆分或者縱向拆分。
最後是Server端上的一些優化,合理配置線程池,加上Redis緩存,通過緩存去分擔MySQL的查詢壓力。
6.對MySQL優化的根本是在優化什麼
所有的優化都是在對IO進行優化
7.你認為SpringIOC容器有缺點嗎?
有啊,當我們的項目很大很複雜時,會在IOC容器中添加很多的依賴,整個項目則是依賴IOC容器。這樣就導緻在進行局部測試時也要初始化IOC容器已經其中的依賴,但是這其中很多的依賴是測試時不需要的,這就給測試的過程帶來不必要的複雜性和性能開銷。
8.你剛剛說的Spring內建其他架構,這個是怎麼實作的
這一塊我拿ORM架構舉例說明。不管是hibernate還是mybatis在Spring中都能很好的得到內建。這裡Spring是有一個ORM接入模闆,這個模闆主要使用了模闆方法的設計模式。各個ORM架構都重寫模闆方法暴露出來的鈎子方法,然後Spring通過調用模版方法直接就能使用到不同的ORM架構了。
9.在你的項目中你什麼進行異常處理的
我的項目主要技術點就是使用的Spring,在SpringMVC中的流程鍊中會捕捉未處理Runtime異常并進行事務復原。我利用了SpringMVC這一特性,先自己DIY了幾個不同的異常類,這些異常類都繼承自Runtime異常,保證了SpringMVC能夠捕捉到他們。
這些異常類大體分為使用者操作異常,系統操作異常和參數校驗異常,使用者操作異常就是業務方面的異常,系統操作異常就是IO操作這些異常,參數校驗異常是我對使用者上傳的參數都會進行校驗,校驗不通過時抛出異常。然後在SpringMVC中使用一個全局異常處理分别捕捉不同的異常并進行處理,處理的原則就是傳回給使用者友好的資訊,列印異常日志以做記錄,嚴重時給維護人員報警。
這樣做的好處就是可以統一去處理異常,還能利用Spring捕獲異常時發生的事務復原,保證資料完整性。
10.如果伺服器卡住了,不能dump資料,你會怎麼排查錯誤
通過ps指令查詢程序,看一下哪個程序有異常,如果是資料庫程序的問題,那可能就是發生了死鎖或者大量線程查詢擁塞了。如果是java程序卡住了可能就是發生了邏輯錯誤或者大量請求使伺服器當機了。
11.你的項目中有遇到使用多線程的地方嗎?描述一下
很多啊,一些定時任務,如定時清除使用者産生的臨時資料。還有就是用到線程池的地方都是多線程,我是在使用者身份校驗這塊用到了線程池。
java Web項目中什麼場景中會用到java多線程?
12.我看你在項目中使用session和token雙重認證,說一下吧
Session是伺服器在記憶體中開辟一段空間存放使用者此會話資訊,并傳回給使用者SessionID,下次請求通過請求頭中的SessionID就可以拿到該使用者Session域中的資訊。我用Session做了使用者的自動登入,每次通過SessionID判斷使用者是否已在登入狀态。
Token是用來判斷該次請求的安全性的,在送出資訊的網頁的表單處加上一個hidden的随機字元串作為Token,每次都會更換。伺服器每次都校驗該Token,隻有是最新的token才放行。這樣可以解決表單重複送出問題,而且防範CSRF攻擊。