歡迎光臨
每天分享高質量文章

JavaWeb技術經驗總結(三)

  1. 在Spring專案中,如果需要配置spring xml檔案,要註意,將頂部的schema資訊中的版本資訊去掉,這樣xml配置檔案就不會跟具體的spring版本耦合;而且還可以避免一些詭異的問題,例如下麵這種異常org.xml.sax.SAXParseException :schema_reference.4: 無法讀取方案檔案 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', 原因為 1) 無法找到檔案; 2) 無法讀取檔案; 3) 檔案的根元素不是 這種錯誤的原因是:spring xml配置檔案中指定的xsd檔案讀取不到了,原因多是因為斷網或spring的官網暫時無法連線導致的。 參考:Spring如何載入XSD檔案(org.xml.sax.SAXParseException: Failed to read schema document錯誤的解決方法)

  2. 在Spring + MyBatis專案中,寫SQL陳述句的時候,要註意傳回null的情況,例如:上述SQL陳述句,有可能傳回null,因此resultType必須用Long,且Dao層的傳回值也要用Long,並且需要在呼叫方做出判斷和處理,否則會報空指標錯誤。

  3. awk,用於日誌分析和資料統計。例如,最近有個資料統計的需求,那麼命令awk -F '[:,]' '{s[$4] += $6; a[$4] += $8}END{for(i in s){print i, s[i], a[i]}}' OFS="\t" odsToolResBak可完成的工作是:將一個json字串組成的日誌檔案,按照冒號和分號切割,並按照第4列分組,分別求第6列和第8列的和,最後每行的結果直接用’\t’分割。參考資料如下:

  • AWK簡明教程

  • 資料需求統計常用shell命令—AWK分組求和,分組統計次數

  • 日誌分析檢視——grep,sed,sort,awk運用

  • vim,另一個上古神器,要熟悉常用的命令,例如10,100w!>>test.txt,該命令可將10行到100行的內容複製到另一個檔案test.txt中;參考資料如下:

    • Vim多行複製

  • 分享一個匹配中國大陸的有效手機號碼的正則運算式:點我。另外,使用Java進行正則匹配的教程,可以參考:Java正則運算式

  • Thymeleaf是一種用於代替JSP的新興技術,Spring提供了與Thymeleaf的原生模板(nature template)協作的檢視解析器。Thymeleaf與Velocity不同的地方在於,它看起來就像是原生的Html頁面,不過在Html標簽中增加了訪問Spring bean的功能,並且可以直接在瀏覽器中開啟。一言以蔽之:頁面即原型。關於Thymeleaf的介紹可以參看這篇文章:新一代Java模板引擎Thymeleaf

  • 別傳回null值:當一個方法傳回Collection集合的時候,不要傳回null,如果沒有結果則傳回空的集合(例如:Collections.emptyList();),這樣該方法的客戶就不需要判斷null的邏輯。這就是Java開發中的特例樣式的應用。

  • 如何學習開源專案,例如Spring?接觸Spring近一年了,零零碎碎看了很多資料,看得閱讀,就能將越多零碎的知識點拼接在一起,對Spring的整體設計思路也有漸漸加深的體會。整理一點優質材料在這裡吧:

    • 好書

    • 《Spring揭秘》,關於Spring的技術圖書,這本最好,具體怎麼好?讀了就知道,喜歡探究原理的人讀起來一氣呵成,很hi;

    • 《Spring實戰 第4版》,最近國內剛出中文版,這本書的特點就是:知識點整理清楚,例子完整。雖然少了點原理講解,比較適合Spring入門;

    • 《Spring技術內幕》,這本書去年瀏覽過一次,對程式碼的走讀不錯,但是有些原理性、設計思想闡述得不夠深刻;

    • 好文

    • 我為什麼要做瞎子摸象的踐行者,文中的“如果一個事物龐大到你無法一眼就看透它,瞭解它, 那麼, 不妨先一小塊兒一小塊兒的去探索,然後再結合你探索的這些碎片成果進行拼裝和推演, 慢慢地,你就會對這個龐然大物有了更多的瞭解(當然, 是否能夠完全瞭解,我就不敢妄言了)”這句,非常適合用在這裡。spring發展到現在的4.3,已經非常複雜且包含了太多內容,我們不可能一上來就掌握全域性,只能一點一點去看。

    • Spring框架的設計理念和設計樣式分析

  • 今天遇到一個應用啟動失敗的例子,一直處在tomcat wait的狀態,查了很多問題沒發現原因,最後才想到要看執行緒堆疊,用命令jstack pid >> temp.123將執行緒堆疊dump到檔案中,發現某個bean初始化的時候依賴了第三方服務,而部署的機器跟那個服務屬於兩個獨立環境,因此執行緒在這裡Hold住了。

    • 當發現應用表現為效能低下、啟動卡主時,要使用jstack看執行緒堆疊;

    • 當發現應用表現為記憶體gc異常,要使用jstat檢視記憶體使用情況

  • 今天對應用做效能測試的時候,發現CPU一直打滿,由於該應用中大量應用了非同步任務,懷疑是執行緒太多導致的CPU爭用。根據關於JVM CPU資源佔用過高的問題排查一文的提示,首先透過top命令,獲得JVM行程的PID;然後用命令top -H -p PID,獲得JVM中各個執行緒的執行情況,可以看到某些行程消耗的CPU一直在90多,記錄這些執行緒的thread id,並轉成十六進位制;然後用命令jstack -l PID >> temp.123將JVM的執行棧列印到檔案中,然後利用上述的十六進位制thread_id在檔案中查詢,就可以看該執行緒的CPU都消耗在哪裡了。 透過抓堆疊發現,那些佔用CPU比例過高的執行緒都是http處理執行緒:要不就是在等待請求到來;要不就是在處理一個JSON字串——String responseContent = JSON.toJSONString(retResponse);,然後我們把這個retResponse打印出來一看,NND,這個物件得有1kb大小,好的,那就是這個東西佔用了大量的CPU時間!

  • 在效能問題上,有兩個低階問題首先要排除:(1)大物件的json序列化;(2)日誌級別要調到warn級別,不能在debug級別上進行壓測。

  • 最新的版本:fastjson 1.2.11版本,據說效能比1.1有了很大提升,建議升級。

  • 贊(0)

    分享創造快樂