作者:黃小亮
現象描述:
頁面查詢速度非常慢, 直到報出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); }
|