Java JasperReport非常慢

时间:2012-03-07 15:47:11

标签: java performance jasper-reports

我正在尝试创建一个JasperReport。但执行“JasperFillManager.fillReport()”大约需要10秒。有人知道为什么需要这么长时间吗?

public JasperViewer createReport(Long termin_id) {
    String reportSource = getClass().getResource("/reports/example.jrxml").getPath();
    parameters = new HashMap<String, Object>();
    parameters.put("Terminnummer", termin_id);
    try {
        JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
        Connection c = MySQL.getNativeConnection();
        JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, c); 
        jv = new JasperViewer(print, false);
        });
    } catch (JRException ex) {
        System.out.println(ex.getMessage());
    }
    return jv;

感谢您的帮助。

这是我用于此报告的jrxml文件:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="repTermin" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <property name="ireport.zoom" value="1.0"/>
        <property name="ireport.x" value="0"/>
        <property name="ireport.y" value="0"/>
        <style name="Crosstab Data Text" hAlign="Center"/>
        <parameter name="Terminnummer" class="java.lang.Long"/>
        <parameter name="Bearbeiter" class="java.lang.String"/>
        <parameter name="Teilnehmer" class="java.lang.String"/>
        <queryString>
                <![CDATA[SELECT t.*, a.AKTENZEICHENJAHR, a.AKTENZEICHENNUMMER, a.GRUND, a.BEZEICHNUNG, b.`NAME` AS ANLEGER, b2.`NAME` AS MITARBEITER
FROM demo.TERMIN t, demo.AKTE a, demo.BENUTZER b, demo.BENUTZER b2
WHERE t.ID = $P{Terminnummer} AND b.ID = t.ANLEGER_ID AND a.ID = t.AKTE_ID AND b2.ID = t.MITARBEITER_ID]]>
        </queryString>
        <field name="ID" class="java.lang.Long"/>
        <field name="ART" class="java.lang.String"/>
        <field name="BEMERKUNG" class="java.lang.String"/>
        <field name="BESCHREIBUNG" class="java.lang.String"/>
        <field name="DATUM" class="java.lang.Long"/>
        <field name="DAUER" class="java.lang.Long"/>
        <field name="ERSTELLT" class="java.lang.Long"/>
        <field name="NOTIZEN" class="java.lang.String"/>
        <field name="ORT" class="java.lang.String"/>
        <field name="PRIVAT" class="java.lang.Boolean"/>
        <field name="STATUS" class="java.lang.String"/>
        <field name="AKTE_ID" class="java.lang.Long"/>
        <field name="ANLEGER_ID" class="java.lang.Long"/>
        <field name="MITARBEITER_ID" class="java.lang.Long"/>
        <field name="PERSON_ID" class="java.lang.Long"/>
        <field name="AKTENZEICHENJAHR" class="java.lang.String"/>
        <field name="AKTENZEICHENNUMMER" class="java.lang.String"/>
        <field name="GRUND" class="java.lang.String"/>
        <field name="BEZEICHNUNG" class="java.lang.String"/>
        <field name="ANLEGER" class="java.lang.String"/>
        <field name="MITARBEITER" class="java.lang.String"/>
        <background>
                <band splitType="Stretch"/>
        </background>
        <title>
                <band height="146" splitType="Stretch">
                        <textField pattern="">
                                <reportElement x="0" y="100" width="555" height="20" backcolor="#CCCCCC"/>
                                <textElement textAlignment="Center">
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{ART}.toString()+" am "+new java.text.SimpleDateFormat("dd.MM.yyyy").format(new Date($F{DATUM}))+" ("+new java.text.SimpleDateFormat("EEEEE").format(new Date($F{DATUM}))+") um "+new java.text.SimpleDateFormat("HH:mm").format(new Date($F{DATUM}))+" Uhr"]]></textFieldExpression>
                        </textField>
                </band>
        </title>
        <pageHeader>
                <band height="6" splitType="Stretch">
                        <line>
                                <reportElement x="0" y="0" width="555" height="1"/>
                                <graphicElement>
                                        <pen lineWidth="3.0"/>
                                </graphicElement>
                        </line>
                </band>
        </pageHeader>
        <columnHeader>
                <band height="6" splitType="Stretch"/>
        </columnHeader>
        <detail>
                <band height="472" splitType="Stretch">
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="0" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Akten und Aktenzeichen]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="18" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Bearbeiter der Akte]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="36" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Termin bestimmt für]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="66" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[weitere Teilnehmer]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="202" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Bemerkung]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="231" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Datum]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="249" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Uhrzeit]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="267" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Dauer]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="285" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Ort des Termins]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="332" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Termin notiert am]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="314" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Termin notiert von]]></text>
                        </staticText>
                        <staticText>
                                <reportElement mode="Opaque" x="0" y="363" width="219" height="18" backcolor="#CCCCCC"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14" isBold="true"/>
                                </textElement>
                                <text><![CDATA[Notizen]]></text>
                        </staticText>
                        <textField>
                                <reportElement x="240" y="0" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{AKTENZEICHENJAHR}+" - "+$F{AKTENZEICHENNUMMER}+" "+$F{GRUND}]]></textFieldExpression>
                        </textField>
                        <textField isBlankWhenNull="true">
                                <reportElement x="240" y="18" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$P{Bearbeiter}]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="36" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{MITARBEITER}]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="202" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{BEMERKUNG}]]></textFieldExpression>
                        </textField>
                        <textField isBlankWhenNull="true">
                                <reportElement x="240" y="231" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[new java.text.SimpleDateFormat("dd.MMMM yyyy").format(new Date($F{DATUM}))]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="249" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[new java.text.SimpleDateFormat("HH:mm").format(new Date($F{DATUM}))]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="267" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[new java.text.SimpleDateFormat("HH").format(new Date($F{DAUER}))+"h "+new java.text.SimpleDateFormat("mm").format(new Date($F{DAUER}))+" min"]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="285" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{ORT}]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="314" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{ANLEGER}]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="332" width="315" height="18"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[new java.text.SimpleDateFormat("dd.MMMM yyyy, HH:mm").format(new Date($F{ERSTELLT}))]]></textFieldExpression>
                        </textField>
                        <textField>
                                <reportElement x="240" y="363" width="315" height="85"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$F{NOTIZEN}]]></textFieldExpression>
                        </textField>
                        <textField isBlankWhenNull="true">
                                <reportElement x="240" y="66" width="315" height="114"/>
                                <textElement>
                                        <font fontName="Tahoma" size="14"/>
                                </textElement>
                                <textFieldExpression><![CDATA[$P{Teilnehmer}]]></textFieldExpression>
                        </textField>
                </band>
        </detail>
        <columnFooter>
                <band height="45" splitType="Stretch"/>
        </columnFooter>
        <pageFooter>
                <band height="54" splitType="Stretch"/>
        </pageFooter>
        <summary>
                <band height="42" splitType="Stretch"/>
        </summary>
</jasperReport>

3 个答案:

答案 0 :(得分:2)

假设您的报告使用sql查询来获取数据,您是否测试了SQL查询运行多长时间?

另一个问题是您在查询中返回了多少数据?它越多,显然需要的时间越长。

此外,您还要在每次运行时重新编译报告。虽然这可能不适合您,但您可以使用报告的缓存版本。

本质:

  • 检查它是否在缓存中
    • 如果没有编译它
  • 编译jasper文件

您可以使用JasperCompileManager.compileReportToStream(inputStream, outputStream);将其编译为文件,其中输出流是FileOutputStream;

答案 1 :(得分:0)

请尝试使用虚拟器。在这里,我列出了示例代码。

public InputStream xlsReportGen(String xml, String reportTemplate,
        String reportPath, Map<String, Object> reportParams)
        throws Exception {

    ByteArrayOutputStream _out = new ByteArrayOutputStream();
    JRDataSource datasource = new JRXmlDataSource(new File(xml));
    JasperReport jasperReport = (JasperReport) JRLoader
        .loadObjectFromFile(reportPath + reportTemplate);

    // creating the virtualizer
    JRSwapFile swapFile = new JRSwapFile(reportPath, 4096, 4096);
    JRAbstractLRUVirtualizer virtualizer = new JRSwapFileVirtualizer(5000,
        swapFile, true);
    reportParams.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

    JasperPrint _print = JasperFillManager.fillReport(jasperReport,
        reportParams, datasource);

    if (virtualizer != null) {
        virtualizer.cleanup();
    }

    JRXlsExporter exporter = new JRXlsExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, _print);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, _out);
    exporter.setParameter(
        JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
        Boolean.TRUE);
    exporter.exportReport();

    return new ByteArrayInputStream(_out.toByteArray());
}

答案 2 :(得分:0)

检查您是否没有使用两个数据源。我发现jasper在交叉表中使用了两个数据源(主数据源和一个子数据集),但我只需要主数据源。