NO IMAGE

一、背景介紹

1、系統的架構是spring mybaties oracle。
2、系統處理的資料量在五十萬到百萬級之間,採用了kafka進行分散式處理,主要功能和要優化的模組在資料清算和資料匯出。

二、可優化點介紹

1、kafka—分散式訂閱-釋出訊息系統
kafka是一款可靠、可擴充套件、高效能的訊息系統,具體介紹可以看Kafka簡介,這篇文章寫的很不錯。
在本系統主要是利用kafka叢集,開闢多個kafka分割槽(Partition)來實現並行消費而提高效能。
2、阻塞佇列的使用
在資料匯出模組的消費端,先利用多執行緒並行分批處理需要匯出的資料,同時用單執行緒去把資料寫到檔案裡。這裡面資料的傳遞用到了阻塞佇列裡,我用的是效率更高的LinkedBlockingQueue,這個可以看我的另一篇部落格Java阻塞佇列的學習筆記 文章有介紹為什麼LinkedBlockingQueue的效率高一些。這樣這個阻塞佇列就等於自己實現的一個小的訊息系統,生產者生產資料和消費者取資料可以同時進行,提高系統整體的處理效能。
3、oracle的sql語句優化
下面的是我總結的oracle的sql語句常用優化原則:
儘量使用表的別名去操作列,提高表的連線效率和避免列名歧義。
Select避免使用*,因為oracle解析sql語句時會去查詢資料字典把'*'轉換成列名,這裡會消耗一些時間。
把sql語句轉換成全部大寫,如果是小寫,oracle解析sql時也會去轉成大寫的,所以我們可以自己先轉成大寫的。
多表查詢時表的順序,oracle解析表時是按照從右至左的順序,所以我們應該把資料量小的表放在右邊,如果是連線用的中間表,也應該放在最右邊。
where子句的順序 ,oracle解析where子句時是按照自上而下的順序,所以我們應該把能夠篩選出大量資料的條件放在後面,而連線表的子句應該放在靠近where的位置。
儘量不要使用order by,在oracle裡,如果order by後面的條件沒有加索引的話就會造成全表掃描。
3、程式碼優化–總結幾個我日常發現的小技巧
for迴圈的使用:
用for(i=0;i<size;i )的效率會高於foreach方法;for迴圈裡面的條件size不要直接用list.size()放在for迴圈裡面取,先在迴圈外面取出size,再放到for迴圈裡,不然每迴圈一次都要去取列表的size。
事務的控制
使用事務的原則是避免長事務和避免亂開事務,很典型的就是我們經常會在service的實現類上加上事務註解,而實際上類的很多方法根本不需要開事務,造成了資源的浪費,我們應該在需要用到事務的方法上去開啟事務。
多執行緒和執行緒池的運用
利用多執行緒並行處理是提高效能的關鍵,而合理的使用執行緒池也可以減少重複建立執行緒的損耗,同時非同步處理耗時比較長的操作也可以提升使用者體驗。這裡推薦一篇關於要開多大的執行緒池比較合適的文章.執行緒池數量設定 這個文章寫分析的很好。
儘量減少資料庫的連線開銷
減少與資料庫的互動,使用批量插入或更新的方法,或者增加快取的使用,減輕資料庫的壓力,資料庫IO非常耗時,特別是在這種百萬級資料量的處理上,往往你在資料庫連線上優化了一點點時間,到最終的效能卻會提高很多。

以上就是我最近在工作中遇到效能優化需求所關注的一些關鍵點,如果有錯誤的地方,歡迎指正。

PS:剛開始寫部落格,才疏學淺,語言組織能力也不行,請各位見諒~~