1

I'm using Jasper Reports 6.7.0 but reports generating so slowly.

I'm generating report for only one record from the database but don't know why I'm getting poor performance.

I've referred some questions from stack overflow but isn't helpful
JasperReports fillReport too slow and resource consuming

I'm using following code on button click to generate report in JavaFX application.

@FXML
private void viewReport(ActionEvent e) {
        Followup followup = followupTable.getSelectionModel().getSelectedItem();
        if (followup != null) {
            int fuRprtId = followup.getFuId();
            try {
                FileInputStream fis = new FileInputStream("src/com/homeo/reports/report1.jrxml");
                BufferedInputStream bis = new BufferedInputStream(fis);
                Map map = new HashMap();
                map.put("fuId", fuRprtId);
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/OPD", "root", "");

                JasperReport jasperReport = (JasperReport) JasperCompileManager.compileReport(bis);
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, con);

                JasperViewer.viewReport(jasperPrint, false);
            } catch (SQLException | ClassNotFoundException | FileNotFoundException | JRException ex) {
                Logger.getLogger(FollowUpController.class
                        .getName()).log(Level.SEVERE, null, ex);
            }
        }  

SQL syntax:

SELECT
     followup.`full name` AS followup_full_name,
     followup.`complaints` AS followup_complaints,
     followup.`remedy` AS followup_remedy,
     followup.`fu id` AS followup_fu_id,
     followup.`patientid` AS followup_patientid,
     followup.`date` AS followup_date,
     patient.`age` AS patient_age,
     patient.`address` AS patient_address,
     patient.`ref by` AS patient_ref_by,
     patient.`occupation` AS patient_occupation,
     patient.`diagnosis` AS patient_diagnosis,
     patient.`mother` AS patient_mother,
     patient.`matgrandmother` AS patient_matgrandmother,
     patient.`mat grandfather` AS patient_mat_grandfather,
     patient.`mat uncle` AS patient_mat_uncle,
     patient.`mat aunt` AS patient_mat_aunt,
     patient.`pat uncle` AS patient_pat_uncle,
     patient.`pat aunt` AS patient_pat_aunt,
     patient.`patgrand mother` AS patient_patgrand_mother,
     patient.`pat grandfather` AS patient_pat_grandfather,
     patient.`husband` AS patient_husband,
     patient.`wife` AS patient_wife,
     patient.`children` AS patient_children,
     patient.`brother` AS patient_brother,
     patient.`sister` AS patient_sister,
     patient.`phone` AS patient_phone,
     patient.`gender` AS patient_gender,
     patient.`dob` AS patient_dob,
     patient.`patnt id` AS patient_patnt_id,
     patient.`father` AS patient_father
FROM
     `patient` patient INNER JOIN `followup` followup ON patient.`patnt id` = followup.`patientid` where `fu id` = $P{fuId}  

It is taking approx 8 seconds to load

How to speed up it?

Also report don't load when I build an app

Swapnil
  • 115
  • 1
  • 12
  • Could you monitor which step exactly is slow? E.g. it could be your SQL – huellif Oct 15 '19 at 07:58
  • @Swapnil: To check if the slowness is depended from your SQL query, you can write a more simple query (without join or with only one row) and check the time to fill your report. – Joe Taras Oct 15 '19 at 12:54
  • If you don't want to use JOIN you must use subquery for each field of followup table, but is more expensive about performance. If your JOIN is slow, check if you have added the correct indexes on your involved tables – Joe Taras Oct 15 '19 at 13:49
  • Which DBMS are you using? – Joe Taras Oct 15 '19 at 13:54
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/200903/discussion-between-swapnil-and-joe-taras). – Swapnil Oct 15 '19 at 13:56
  • Guys thank you for the attention and efforts you put. I've solved it. Thank you so much – Swapnil Oct 17 '19 at 10:40

1 Answers1

2

I was curious why it is being slower.
It was too much slower approx 8 to 9 seconds.

But I ignored it and go ahead and build as it is but now report was not showing anyway.

As I had already preferred questions for slowness and wasn't helpful.
I changed my code and it solved all the problem I have about jasper report.

I don't recommend following code I guess it is old fashioned and not proper way to do

   FileInputStream fis = new FileInputStream("src/com/homeo/reports/report1.jrxml");
    BufferedInputStream bis = new BufferedInputStream(fis);
    Map map = new HashMap();
    map.put("fuId", fuRprtId);
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/OPD", "root", "");

    JasperReport jasperReport = (JasperReport) JasperCompileManager.compileReport(bis);
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, con);

    JasperViewer.viewReport(jasperPrint, false);

I used following code which is too much faster than above code. Takes approx 2 seconds to load

try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/OPD", "root", "")) {
    InputStream inputStream = getClass().getResourceAsStream("/com/homeo/reports/report1.jasper");

    JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map, con);
    JasperViewer.viewReport(jasperPrint, false);
    con.close();  
}
  } catch (SQLException | ClassNotFoundException | JRException ex) {
        Logger.getLogger(FollowUpController.class
                .getName()).log(Level.SEVERE, null, ex);
}  

To make above code work properly

You have to use compiled
report.jsper instead report.jrfxml
and use
"/com/reports/report.jsper" instead "/src/com/reports/report.jsper"

Swapnil
  • 115
  • 1
  • 12