http 502錯誤(多層循環引起的性能問題)

作者:黃小亮

 

現象描述:

頁面查詢速度非常慢, 直到報出502 錯誤(Bad gateway)

 

現象描述:

頁面查詢速度非常慢, 直到報出502 錯誤(Bad gateway)

錯誤分析

分析過程:

在項目做了壓力測試後( 壓力測試和功能是用的是一個數據庫, 壓力測試時產生了大量數據 ), 測試環境的查詢變的很慢, 超過了mod_jk.conf 中配置的請求超時時間(JkWorkerProperty worker.localnode.socket_timeout=20, 請求轉發給jboss 後,最長等待的時間 ). 頁面報出了502 錯誤.

 

 

原因分析:

通過debug 觀察到一次查詢查出來的 parentNodeDOList childNodeDOList 各有近萬條數據, 下面嵌套進行數據的組裝, 消耗了比較多的時間. 代碼片段如下:

( for ParentNod eDO parentNodeDO: parentNodeDOList ()) {

                    parentNodeDOId = parentNodeDO.getId();

                    for (ChildNodeDO childNodeDO : childNodeDOList ) {

                       if (childNodeDO.getParentNodeId().equals(parentNodeDOId)) {

                          parentNodeDO.getChildNodeDOList().add(childNodeDO);

                        }

                    }

}

 

正確用法

正確用法 ( 將上面代碼中 parentNodeDOList 轉換爲 Map, 再進行組裝 , N ²降爲 N)

for (ChildNodeDO childNodeDO : childNodeDOList) {

ParentNod eDO    parentNod eDO

=  parentNod eMap .get(childNodeDO.getParentNodeDOId());

                parentNodeDO.getChildNodeDOList().add(childNodeDO);

        }

 

 

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 1487
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章