當我嘗試在我的項目中下載CSV時,CPU在服務器上出現CPU性能問題,CPU變爲100%,但SQL在1分鐘內返回響應。在CSV中,我們爲一個用戶編寫了大約600K條記錄,但它對於併發用戶來說工作正常,但我們遇到了這個問題。當我嘗試在春季下載CSV時獲得CPU 100%
環境
- 春4.2.5
- Tomcat的7/8(2GB內存分配)
- 的MySQL 5.0.5
- 的Java 1.7
這裏是彈簧控制器代碼: -
@RequestMapping(value="csvData")
public void getCSVData(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value="param1", required=false) String param1,
@RequestParam(value="param2", required=false) String param2,
@RequestParam(value="param3", required=false) String param3) throws IOException{
List<Log> logs = service.getCSVData(param1,param2,param3);
response.setHeader("Content-type","application/csv");
response.setHeader("Content-disposition","inline; filename=logData.csv");
PrintWriter out = response.getWriter();
out.println("Field1,Field2,Field3,.......,Field16");
for(Log row: logs){
out.println(row.getField1()+","+row.getField2()+","+row.getField3()+"......"+row.getField16());
}
out.flush();
out.close();
}}
持久性代碼: -我使用Spring的JdbcTemplate
@Override
public List<Log> getCSVLog(String param1,String param2,String param3) {
String sql =SqlConstants.CSV_ACTIVITY.toString();
List<Log> csvLog = JdbcTemplate.query(sql, new Object[]{param1, param2, param3},
new RowMapper<Log>() {
@Override
public Log mapRow(ResultSet rs, int rowNum)
throws SQLException {
Log log = new Log();
log.getField1(rs.getInt("field1"));
log.getField2(rs.getString("field2"));
log.getField3(rs.getString("field3"));
.
.
.
log.getField16(rs.getString("field16"));
}
return log;
}
});
return csvLog;
}
您應提供持久性的代碼 - 如果SQL返回性反應,1分鐘後我認爲瓶頸是在數據庫中,而不是在Java中 – Cootri
Cootri,使用StringBuilder的後我收到HTTP狀態500 - 處理程序處理失敗;嵌套的異常是java.lang.OutOfMemoryError:超出GC開銷限制 –
如果您設法將問題縮小到數據庫調用,那麼您包含的代碼是不相關的。沒有什麼能夠幫助診斷目前問題中的問題。 – kryger