JasperReports একটি শক্তিশালী Java ভিত্তিক রিপোর্টিং টুল যা বিভিন্ন ধরনের রিপোর্ট তৈরি করতে সক্ষম। তবে, যখন আপনি বড় ডেটাসেট বা জটিল রিপোর্ট নিয়ে কাজ করেন, তখন রিপোর্ট তৈরির পারফরম্যান্স একটি বড় সমস্যা হতে পারে। JasperReports এর পারফরম্যান্স অপটিমাইজেশন করা হলে আপনার অ্যাপ্লিকেশন দ্রুততর এবং আরও কার্যকরী হয়ে ওঠে।
নিম্নলিখিত কয়েকটি পদ্ধতি অনুসরণ করলে JasperReports এর পারফরম্যান্স এবং মেমরি ব্যবস্থাপনা উন্নত করা সম্ভব:
1. ObjectMapper পুনঃব্যবহার (Reuse ObjectMapper)
ObjectMapper JasperReports এ একটি ভারী অবজেক্ট এবং প্রতিবার এটি তৈরি করলে মেমরি এবং পারফরম্যান্সে প্রভাব পড়তে পারে। ObjectMapper একবার তৈরি করে পুনঃব্যবহার করা একটি ভাল অভ্যাস।
প্রধান পদ্ধতি:
public class ObjectMapperProvider {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
public static ObjectMapper getInstance() {
return OBJECT_MAPPER;
}
}
Spring Boot এ Bean হিসেবে ObjectMapper ব্যবহার:
@Configuration
public class JasperConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
}
2. Streaming API ব্যবহার (Use Streaming API)
JasperReports যখন streaming mode (JSON, XML, বা Database থেকে ডেটা পড়া) ব্যবহার করে তখন মেমরি খরচ কমে এবং পারফরম্যান্স বৃদ্ধি পায়। JasperReports Streaming API শুধুমাত্র একটি টোকেন পড়ার মাধ্যমে কাজ করে, এবং এটি একবারে পুরো ডেটাসেট লোড না করে এক্সপোর্ট করতে সাহায্য করে।
Streaming API Example:
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
public class StreamingExample {
public static void main(String[] args) throws Exception {
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(new File("large-file.json"));
while (!parser.isClosed()) {
JsonToken token = parser.nextToken();
if (JsonToken.FIELD_NAME.equals(token) && "name".equals(parser.getCurrentName())) {
parser.nextToken();
System.out.println("Name: " + parser.getValueAsString());
}
}
parser.close();
}
}
3. DataSource Optimization
JasperReports ডেটা সোর্সের জন্য JRDataSource ব্যবহার করে। ডেটাবেস থেকে ডেটা ফেচ করার সময় JDBC connection pooling এবং query optimization ব্যবহার করা উচিৎ, যাতে দ্রুত এবং মেমরি-দক্ষভাবে ডেটা ফেচ করা যায়।
- Lazy Loading: ডেটাবেস থেকে lazy loading (প্রয়োজন অনুযায়ী ডেটা লোড) এবং ডেটা ফিল্টারিং ব্যবহার করা উচিত।
Example: Efficient Data Fetching using SQL
String query = "SELECT * FROM employees WHERE hire_date >= ?";
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setDate(1, Date.valueOf("2020-01-01"));
ResultSet resultSet = preparedStatement.executeQuery();
- JDBC Query Optimization: নির্দিষ্ট ডেটা নিয়ে কাজ করলে, অপ্রয়োজনীয় কলাম বা জটিল JOINs পরিহার করুন।
4. Use Subreports Efficiently
JasperReports এ subreports ব্যবহার করলে রিপোর্টের কাঠামো আরও পরিষ্কার এবং মডুলার হয়, তবে সাব-রিপোর্টে অতিরিক্ত complex calculations বা database queries না করার চেষ্টা করুন। Subreport কে data source হিসাবে সরাসরি JDBC বা pre-fetched data ব্যবহার করার মাধ্যমে অপটিমাইজ করুন।
Subreport Example:
<subreport>
<reportElement x="0" y="20" width="555" height="200"/>
<subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression>
</subreport>
5. Limit Memory Usage
JasperReports বড় ডেটাসেট এবং কমপ্লেক্স রিপোর্টে মেমরি ব্যবহার বাড়িয়ে ফেলতে পারে। এর জন্য কিছু পদ্ধতি রয়েছে:
- Compression: রিপোর্টের output ফাইলের সাইজ কমাতে compression techniques ব্যবহার করুন।
- Exporting Large Reports to Files: বড় রিপোর্টকে মেমরিতে না রেখে সরাসরি ফাইল আউটপুটে পাঠান।
Export to CSV Example (Efficient File Export):
JRCsvExporter exporter = new JRCsvExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleWriterExporterOutput("output.csv"));
exporter.exportReport();
6. Use Pagination for Large Reports
যখন রিপোর্টে অনেক রেকর্ড থাকে, তখন পুরো রিপোর্ট একসাথে প্রদর্শন করার চেয়ে পৃষ্ঠার ভিত্তিতে pagination ব্যবহার করা ভাল।
Pagination Example:
<pageBreak />
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{employee_name}]]></textFieldExpression>
</textField>
</band>
</detail>
Pagination ব্যবহার করে আপনি রেকর্ডগুলোকে পৃষ্ঠার মধ্যে ভাগ করে ফেলতে পারবেন, যা মেমরি ব্যবহারে দক্ষতা বৃদ্ধি করে।
7. Use JasperReports' Built-in Caching
JasperReports আপনাকে report caching সমর্থন করে, যার মাধ্যমে একাধিকবার রিপোর্টের জন্য একই ডেটা ব্যবহার করার ক্ষেত্রে পুনরায় প্রসেসিংয়ের প্রয়োজন হয় না।
Cache Example:
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
JasperPrintCache.getInstance().add(jasperPrint);
8. Use Efficient Export Formats
যখন রিপোর্টের আউটপুটে Excel, HTML, বা PDF এক্সপোর্ট করবেন, তখন প্রতি ফরম্যাটের জন্য সঠিক এক্সপোর্ট মেথড এবং ফাইল সাইজ কাস্টমাইজেশন নিশ্চিত করুন।
- Excel Export: XLSX ফরম্যাটের পরিবর্তে XLS ফরম্যাট ব্যবহার করুন, কারণ XLSX ফরম্যাট সাধারণত দ্রুত এবং কম সাইজে হয়।
- PDF Export: রিপোর্টে অতিরিক্ত ইমেজ বা গ্রাফিক্স না রাখলে PDF ফাইল সাইজ কমানো যায়।
JasperExportManager.exportReportToXlsxFile(jasperPrint, "report.xlsx");
- JasperReports Performance Optimization এর জন্য ObjectMapper reuse, Streaming API, এবং efficient data fetching ব্যবহার করা উচিত।
- Subreports এবং pagination ব্যবহার করে বড় ডেটা সেট বা রিপোর্টগুলো মেমরি এবং সময়ের দিক থেকে দক্ষভাবে প্রক্রিয়া করা যায়।
- PDF এবং Excel এক্সপোর্টের জন্য font embedding, compression, এবং optimized queries নিশ্চিত করুন।
- Caching এবং export formats কাস্টমাইজেশন রিপোর্টের পারফরম্যান্স উন্নত করতে সাহায্য করে।
Read more