Javaアプリからレポートを入力するとき、JasperReportsは本当に遅いであることがわかりました。プログラムは次の行でハングします:
print = JasperFillManager.fillReport(report, parameters, xmlDataSource);
通常はそこにとどまります分間、最大300MbのRAMおよび50%CPを消費します。
report
は、3つのサブレポートを使用するコンパイル済み(.jasper)レポートです。では、どうすればレポートの入力パフォーマンスを向上させることができますか?
問題は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
Pdfをエクスポートしているときにもこの問題が発生していましたが、JasperReportを生成しようとしたときにCPUが100%に達していたため、私の場合は無限ループのように見えました。
多くの調査の後、私はこのリンクを見つけました:
http://community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill
サブレポートを設定することで、どの問題が解決されたかisPrintWhenDetailOverflows="false"
。