2

Jasper Reports を使用してレポートを生成しています。しかし、データベースからの膨大なデータがあります。Jasper print を実行してレポート データを埋める際に、大量のメモリを消費し、Java ヒープ スペース メモリの問題を引き起こします。

JasperPrint jasperPrint = JasperFillManager.fillReport(
                    jasperReport, params, dataSource);

これは、非常に時間がかかり、エラーが発生する行です。この問題から抜け出す方法を教えてください。

Stackrace : 
java.lang.OutOfMemoryError: Java heap space
    at net.sf.jasperreports.engine.fill.JRFillTextField.fill(JRFillTextField.java:691)
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.fillElements(JRFillElementContainer.java:570)
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:390)
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:351)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2039)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:771)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportContent(JRVerticalFiller.java:301)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:148)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
    at com.jci.eprt.web.controller.report.ReportController.previewEngineeringReport(ReportController.java:250)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.jci.eprt.service.utility.helper.JCIUserFilter.doFilter(JCIUserFilter.java:39)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
4

2 に答える 2

2

これは、膨大な結果セットを含むレポートを扱う場合によくある問題です。明らかな解決策は、結果セット全体を一度に読み取るのではなく、代わりに段階的に読み取ることです。

この問題の対処に関する詳細な説明は、Java DevZone: Generating Huge reports in JasperReports に記載されています。このリファレンスに書かれている数行:

アプリケーションがメモリ不足にならないように、メモリを効率的に処理するために巨大なデータセットの Jasper レポートを実装する際に注意すべき点があります。

彼らです:

1) データのページネーションと JRDataSource の使用、

2) レポートの仮想化。

于 2013-04-22T22:32:45.280 に答える
0

Tomcat Web サーバーは、Web アプリケーションを数回デプロイおよびアンデプロイするたびに、 java.lang.OutOfMemoryError: PermGen space に悩まされることがよくあります。tomcat6、tomcat7 を使用しているか、Netbeans または Eclipse でバンドルされている tomcat を使用しているかに関係なく、Tomcat サーバーで Web アプリケーションを開発しているときに、このエラーに直面することがあります。

ヒープの PermGen Space を増やしてみてください。このリンクを参照できます

于 2013-04-23T05:08:08.497 に答える