Выполнение вложенного отчета возвращает java.lang.OutOfMemoryError: превышен предел накладных расходов сборщика мусора

Вот моя проблема: у меня есть JasperReport (mainReport) с одним вложенным отчетом (subReport), который в то же время имеет один вложенный отчет (subSubReport ). Моя проблема возникает, когда я пытаюсь выполнить ее из своего веб-приложения. Эти отчеты извлекаются из базы данных Oracle, поэтому я передаю для них InputStream в качестве «пути».

Поскольку я тестировал «пути» как InputStream (полученный из той же базы данных), я знаю, что он работает, когда у меня есть простая иерархия mainReport -> subReport ... почему я почти уверен, что проблема заключается в том, как я передаю параметры в subSubReport.

Поскольку теперь, если я хочу передать какой-либо параметр (в качестве пути) в subReport, он должен быть определен в mainReport (также передается в mainReport в качестве параметра), и его нужно было передать как параметр из mainReport в подотчет. По этой причине я переношу все параметры, даже те, которые необходимы для subSubReports, в mainReport (и я предполагаю, что это неправильный способ, поскольку я получение java.lang.OutOfMemoryError: GC overhead limit exceeded when executing).

Я следую следующему формату, чтобы определить, куда должен идти каждый из моих параметров:

  • SUBREPORT_DIR для тех отчетов, которые хранятся в локальной папке.

  • SUBREPORTxLEVELy для тех отчетов, которые есть в базе данных.

Где:

x определяет номер подотчета в соответствии с его положением (полосой, в которой он находится) в основном отчете.

y определяет уровень, на котором необходим параметр (в данном случае subReport находится на уровне 1, а subSubReport - на уровне 2).

Например:

Имея такую ​​иерархию, я кодирую ее следующим образом:

Проблемная иерархия

mainReport

------------> подотчет

-------------------------> subSubReport

Обратите внимание, что я определил SUBREPORT_DIR и SUBREPORTxLEVELy, потому что отчет можно найти либо в локальной папке, либо в базе данных, а в моем дизайне яшмы у меня есть это выражение для вложенных отчетов IF($P{SUBREPORT_DIR}==null,$P{SUBREPORTxLEVELy},$P{SUBREPORT_DIR}).

Вот код, используемый в каждом отчете, и код Java для создания отчета.

mainReport

<subreport>
        <reportElement key="" x="0" y="0" width="554" height="30" isRemoveLineWhenBlank="true" uuid="18ff5513-835d-4910-b39c-6d41252b4679"/>
<subreportParameter name="REPORT_CONNECTION">
<subreportParameterExpression><![CDATA[$P{REPORT_CONNECTION}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT_DIR">
<subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT1LEVEL1">
<subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL1}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT1LEVEL2">
<subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL2}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[IF($P{SUBREPORT_DIR}==null,$P{SUBREPORT1LEVEL1},$P{SUBREPORT_DIR})]]></subreportExpression>
</subreport>

подотчет

<subreport>

<reportElement x="50" y="10" width="457" height="40" uuid="4528914e-bb9a-4300-8173-14be2ff2db85"/>

<subreportParameter name="REPORT_CONNECTION">

        <subreportParameterExpression><![CDATA[$P{REPORT_CONNECTION}]]></subreportParameterExpression>

</subreportParameter>

<subreportParameter name="REPORT_DATA_SOURCE">

<subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>

</subreportParameter>

<subreportParameter name="SUBREPORT_DIR">

         <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>

        </subreportParameter>

<subreportParameter name="SUBREPORT1LEVEL2">

<subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL2}]]></subreportParameterExpression>

</subreportParameter>

<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>

<subreportExpression><![CDATA[IF($P{SUBREPORT_DIR}==null,$P{SUBREPORT1LEVEL2},$P{SUBREPORT_DIR})]]></subreportExpression>

</subreport>

код Java

parameters.put("SUBREPORT1LEVEL1", inputStream1); (для подотчета) parameters.put("SUBREPORT1LEVEL2", inputStream2); (для подотчета)

Не счел необходимым опубликовать остальную часть кода Java, потому что я знаю, что он работает так, как должен.

Три отчета прекрасно компилируются в дизайнере (каждый отдельно), правильно генерируя файл .jasper.

Итак, мои вопросы были сказаны:

  • Что я делаю неправильно?
  • Как мне передать параметры для определения пути отчета для subSubReport?
  • Нужно ли передавать параметр в mainReport, как я, когда у меня есть subReport?

В заключение я хочу иметь возможность назначать правильный InputStream каждому subReport / subSubReport. Какой из них является лучшим (и известным) способом сделать это?

Большое спасибо!

Вопрос задан по адресу: http://community.jaspersoft.com/questions/1042586/sub-subreport-execution-returns-javalangoutofmemoryerror-gc-overhead-limit


person Lille    schedule 09.02.2017    source источник
comment
Как объявляются и инициализируются входные потоки?   -  person Stephen C    schedule 09.02.2017
comment
Трудно понять, создаете ли вы какую-то странную рекурсию, но «java.lang.OutOfMemoryError: превышен предел накладных расходов GC» также может быть вызван слишком большим объемом загруженных данных, проверьте отчет jasper виртуализаторы.   -  person Petter Friberg    schedule 13.02.2017
comment
Спасибо @PetterFriberg, я посмотрю и посмотрю, что я могу выдержать!   -  person Lille    schedule 13.02.2017