web-dev-qa-db-ja.com

JasperReports fillReportが遅すぎて、リソースを消費します

Javaアプリからレポートを入力するとき、JasperReportsは本当に遅いであることがわかりました。プログラムは次の行でハングします:

print = JasperFillManager.fillReport(report, parameters, xmlDataSource);

通常はそこにとどまります分間、最大300MbのRAMおよび50%CPを消費します。

  • reportは、3つのサブレポートを使用するコンパイル済み(.jasper)レポートです。
  • データソースはかなり大きなXMLファイルです(約100k行、1.5Mb)
  • マシンは4GbのRAMを備えた3Ghzデュアルコアです

では、どうすればレポートの入力パフォーマンスを向上させることができますか?

17
Salvatorelab

問題

問題はXPathエンジンにあるようです。つまり、XMLファイルを解析してデータを探すライブラリです。

IReport DesignerはJaxenを使用しますが、JasperReportはXalanを使用します。 XalanはJaxenに比べて本当に遅いです(本当に本当に遅いです)。

そのため、この問題は、iReportsからではなく、Javaアプリケーションからレポートを入力するときにのみ発生します。

ソリューション

まあ、解決策は簡単です、 Javaアプリケーションに次の行を追加して、デフォルトのXalanlibの代わりにJaxenlibを選択します(非推奨ですが、機能します)。

JRProperties.setProperty("net.sf.jasperreports.xpath.executer.factory",
    "net.sf.jasperreports.engine.util.xml.JaxenXPathExecuterFactory");

[〜#〜] edit [〜#〜]:その行は非推奨になりました。プロパティを設定する正しい方法を見つけました:

DefaultJasperReportsContext context = DefaultJasperReportsContext.getInstance();
JRPropertiesUtil.getInstance(context).setProperty("net.sf.jasperreports.xpath.executer.factory",
    "net.sf.jasperreports.engine.util.xml.JaxenXPathExecuterFactory");

また、ビルドパスにJaxen.jarを追加する必要があります。ここにリンクがあります: https://mvnrepository.com/artifact/jaxen/jaxen


レポートの入力はXalanでは3〜5分かかりましたが、Jaxenではわずか数秒で完了します。

答えはここで見つかりました: http://community.jaspersoft.com/questions/536842/jasperreports-too-slow
そしてここにも: http://community.jaspersoft.com/wiki/xml-data-source-very-slow-parse

17
Salvatorelab

Pdfをエクスポートしているときにもこの問題が発生していましたが、JasperReportを生成しようとしたときにCPUが100%に達していたため、私の場合は無限ループのように見えました。

多くの調査の後、私はこのリンクを見つけました:

http://community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill

サブレポートを設定することで、どの問題が解決されたかisPrintWhenDetailOverflows="false"

4
jairobjunior