提高你的Java應用性能:改善數據處理

許多應用程序在壓力測試階段或在生產環境中都會遇到性能問題。若是咱們看一下性能問題背後的緣由,會發現不少是由數據處理不當形成。數據處理在應用面對大數據量時是很是關鍵的。這裏有一些實用的數據處理技巧能夠幫助更好地提高Java應用程序性能。算法

減小數據傳輸

在任何Java應用程序中,方法調用要麼是爲調用方完成某項任務,要麼是對輸入數據進行處理。這兩個目標都須要在調用者和處理方法之間進行數據交換。關於最小化函數傳入和輸出的數據量有一個經驗之談:數據越小好處越多。好比越小的數據處理就越少,須要清理的對象越少,內存的佔用也更少等等。程序設計應當努力減小不一樣方法、層次和應用程序之間,甚至組織之間的數據傳遞。經過下面將要討論的源端數據處理能夠達成這個目標。數據庫

延遲加載

延遲數據加載是指直到實際須要最後一刻才從數據存儲中獲取數據。在面對重量級對象時這是很是有益的。例若有一個存儲在數據庫中的文件實體,文件包含blob以及與其餘屬性。blob大小能夠從幾KB到幾十兆。中間層邏輯在顯示文件內容以前都只依賴於其餘屬性。使用延遲加載能夠用來處理這個blob屬性。緩存

不斷重複數據調用

當進行遠程調用時,從數據提供者反覆調用取得數據會嚴重影響性能,好比數據庫調用、Web服務調用或者其餘編解碼調用。這種狀況下可使用Facade模式一次得到全部所需的數據,儘量減少鏈接成本和在網絡上傳輸數據的成本。網絡

高速緩衝

常用但不常常變化的數據能夠進行緩存,一般須要緩存的是靜態或者服務端數據。現在,對應用事務數據也有很高的要求,這些數據也須要加入緩存。做爲一個簡單的規則,在設計應用程序時常常須要識別這類實體並緩存到合適的位置,一般這些實體不會頻繁改變甚至根本不會變化。刷新對象時也能夠採用這個規則。oracle

在源端處理數據

在數據源或存儲位置自己進行處理是一個好習慣。將大量數據發送給客戶端而後再進行處理須要傳輸成本,並且有時客戶端的處理邏輯會改變數據格式。例如在oracle中過濾數據比較簡單,只要爲查詢添加一個WHERE子句便可。而在Java程序中過濾這麼數據須要先獲取記錄再逐行挨個屬性進行比較。所以用Java可能不是最佳實現。框架

儘量減小數據轉換和避免不正確的數據類型

將數據從一種格式轉換到其餘格式須要轉換成本。對單個值進行轉換消耗的性能可能微不足道,但若是記錄個數成千上萬性能問題就十分明顯。例如選擇String數據類型的值,並把它轉換爲double或其餘基本類型,反之亦然。ide

保持數據的正確採集

從性能的角度來看,這是一個很是重要的考慮因素。 Java已經提供了不一樣的集合以知足不一樣的需求,例若有幾種原始的集合,好比ArrayList,你能夠不斷向ArrayList添加數據而且集合自己不會對數據進行任何操做。再好比Vector提供了同步的操做。我須要在插入數據時保持同步嗎?這是一個很好的問題。若是不須要同步那麼就不要使用Vector,使用ArrayList或根據要求選擇他集合。函數

對數據處理算法進一步優化

有時候性能問題是數據處理算法或實現邏輯形成的。實現邏輯應該將性能做爲要求達到的一個目標,像是內存佔用等。經過如下幾個方法可使算法進一步優化:性能

  • 優化開銷很大的調用和數據庫循環調用測試

  • 優化循環裏的對象聲明

  • 避免沒必要要的嵌套循環

  • 將對象存儲到多個集合

Finalize重型數據對象

咱們不能保證會當即執行垃圾收集,可是爲對象設置爲final或置爲null是一個很好的作法。

利用技術特色優化數據處理

許多技術都有助於數據處理,其中包含了上面提到的一些要點。下面是幾個例子:

  • Oracle的prepared statement

  • 緩存框架,例如Hibernate的一級緩存和二級緩存

  • Hibernate框架的延遲加載機制

數據序列化和反序列化

在設計時須要避免性能代價太高的操做。若是沒有這樣的操做,還能夠把數據轉換減到最小。例如在Web應用程序能夠儘可能減小會話的輸出數據。

並行處理數據

若是須要處理的數據量很大,那麼能夠並行處理不相關的數據以減小總的處理時間。

對象重用

對於重量級對象不要從頭建立,能夠對現有對象進行克隆而且只修改必要的屬性儘量重用現有的信息。經過淺拷貝和深拷貝來控制重用的數量。

相關文章
相關標籤/搜索