非常に巨大なジャスパーレポート(約20000ページ)をエクスポートしています。その目的のために、さまざまなWebサイトで提案されているように、メモリ不足エラーを回避するために、以下に示すようにJRSwapFileVirtualizeを使用しています。
virtualizer = new JRSwapFileVirtualizer(1000, new JRSwapFile(reportFilePath, 2048, 1024), true);
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
.
.
JasperPrint print = JasperFillManager.fillReport(report, parameters, list);
virtualizer.cleanup();
私の質問は次のとおりです。
1)maxSizeを1000に設定しました。20000ページのレポートで問題ありませんか?
2)メソッド呼び出し'fillReport'の直後にバーチャライザーをクリーンアップしています。レポートをXLSにエクスポートした後、それは正しいですか、それともバーチャライザーをクリーンアップする必要がありますか?
3)とにかく、レポートをエクスポートした後にバーチャライザーをクリーンアップすることは役に立ちますか?
4)JasperPrintオブジェクトを作成し、ロジックはサーバー側で記述されます。レポートロジックのエクスポートは、Javaクライアントで記述されています。レポートをエクスポートした後、仮想化機能をクリーンアップすることになっている場合、このシナリオをどのように処理しますか?この場合、サーバー側でこのバーチャライザーの静的オブジェクトを作成する必要があるため(JRSwapFileVirtualizerはシリアル化できないため、サーバーとクライアント間で作成して渡すことができないため)、エクスポート後にサーバー側のメソッドを呼び出してクリーンアップする必要がありますバーチャライザー。サーバー側のロジックに対して複数の呼び出しが行われると、virtualizer静的オブジェクトが最新の呼び出しによって作成されたスワップファイルへの参照を保持し、クリーンアップ後に以前のスワップファイルが削除されない可能性があるため、静的オブジェクトの作成はリスクだと考えていました。
このトピックに関する詳細情報を見つけました。ジャスパーが仮想化を使用するために提供したサンプルでは、複数の種類のファイルをエクスポートするcommon exportを呼び出す場合にのみ、仮想化をクリーンアップしています。単一のタイプのレポートのみをエクスポートする場合、クリーンアップを呼び出していません。
else if (TASK_CSV.equals(taskName))
{
exportCSV(jasperPrint);
}
else if (TASK_EXPORT.equals(taskName))
{
exportPDF(jasperPrint);
exportXML(jasperPrint, false);
exportHTML(jasperPrint);
exportCSV(jasperPrint);
// manually cleaning up
virtualizer.cleanup();
}
また、この例ではXLSエクスポートについて言及していません。その人が同じ問題に直面している別のリンクを見つけましたが、解決策も言及されていません:
http://www.jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=95689
また、このリンクは、代わりにJRXlsxExporterを使用できることを示しています。ただし、JRXlsxExporterは、2003年ではなく2007年形式のみをエクスポートします。
JExcelApiExporter.exportReport()を使用してレポートをXLSにエクスポートしていますが、巨大なレポートの場合は機能しません。この問題を解決するのを手伝ってください。小さなヒントや提案はかなりあります。さらに詳しい情報が必要な場合はお知らせください。ありがとう。