【发布时间】:2016-07-16 19:36:59
【问题描述】:
当我尝试在我的项目中下载 CSV 时,我在服务器上遇到 CPU 性能问题,CPU 达到 100%,但 SQL 在 1 分钟内返回响应。在 CSV 中,我们为一个用户写入了大约 60 万条记录,它工作正常,但对于并发用户,我们遇到了这个问题。
环境
- 春季 4.2.5
- Tomcat 7/8(已分配 2GB 内存)
- MySQL 5.0.5
- Java 1.7
这是 Spring Controller 代码:-
@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,使用 StringBuilder 后,我收到 HTTP 状态 500 - 处理程序处理失败;嵌套异常是 java.lang.OutOfMemoryError: GC 开销限制超出
-
如果您设法将问题缩小到 DB 调用,那么您包含的代码就无关紧要了。没有任何方法可以帮助诊断当前问题中的问题。
-
@NikhilGupta,您使用的是 SAX 解析器还是 DOM 解析器?请使用 SAX 解析器。
-
@PraveenKumar,我正在使用 JDBCTemplate 并获取 ResultSet。
标签: java mysql spring spring-mvc csv