我工作的应用程序之一使用从DB返回的大量数据生成报告。应用程序接收请求作为AJAX异步请求,基于输入参数执行查询,以JSON格式存储数据,生成具有相同内容的Excel,然后将JSON结果返回给浏览器以显示记录。 / p>
有时由于大量数据导致服务器因内存使用率过高而崩溃,有时服务器线程挂起。日志中捕获的异常如下所述:
[3/20/14 21:55:07:051 IST] 0000001a ThreadMonitor W WSVR0605W: Thread "WebContainer : 6" (00000038) has been active for 761754 milliseconds and may be hung. There is/are 1 thread(s) in total in the server that may be hung.
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.ibm.db2.jcc.a.ab.b(ab.java:168)
at com.ibm.db2.jcc.a.ab.c(ab.java:222)
at com.ibm.db2.jcc.a.ab.c(ab.java:337)
at com.ibm.db2.jcc.a.ab.v(ab.java:1447)
at com.ibm.db2.jcc.a.db.a(db.java:42)
at com.ibm.db2.jcc.a.r.a(r.java:30)
at com.ibm.db2.jcc.a.sb.g(sb.java:152)
at com.ibm.db2.jcc.b.zc.n(zc.java:1186)
at com.ibm.db2.jcc.b.ad.db(ad.java:1761)
at com.ibm.db2.jcc.b.ad.d(ad.java:2203)
at com.ibm.db2.jcc.b.ad.U(ad.java:489)
at com.ibm.db2.jcc.b.ad.executeQuery(ad.java:472)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteQuery(WSJdbcPreparedStatement.java:1102)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:723)
at com.abc(ABCDao.java:1250)
at com.abc(ABCFacade.java:159)
at com.abcservlet.doPost(ABCServlet.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
环境详情如下: 1.应用程序服务器 - WebSphere Application Server 7.0.0.29 2.数据库服务器 - DB2 3. JVM内存 - 512MB - 2048 MB
想知道应该是处理这类场景的最佳方法。我们使用poi生成报告,我们使用" org.apache.poi.xssf.streaming.SXSSFWorkbook"在服务器上保留较少的数据。但是,如果数据超过200000条记录,则服务器线程将挂起。