国外域名注册做违法网站新浪云上传wordpress
web/
2025/9/28 1:11:34/
文章来源:
国外域名注册做违法网站,新浪云上传wordpress,企业做网站需要什么资料,采集微信公众号 做网站如果您使用Java进行编程的时间足够长#xff0c;则有可能需要为业务用户生成报告。 就我而言#xff0c;我已经看到几个项目使用JasperReports库来生成PDF和其他文件格式的报告。 最近#xff0c;我荣幸地观察了Mike和他的团队使用上述报告库及其面临的挑战。 简而言之Jasp… 如果您使用Java进行编程的时间足够长则有可能需要为业务用户生成报告。 就我而言我已经看到几个项目使用JasperReports®库来生成PDF和其他文件格式的报告。 最近我荣幸地观察了Mike和他的团队使用上述报告库及其面临的挑战。 简而言之JasperReports 简而言之使用JasperReportsJR生成报告涉及三个步骤 加载已编译的报告即加载JasperReport对象 通过用数据填充报告来运行报告结果是JasperPrint对象 将填充的报告导出到文件例如使用JRPdfExporter导出到PDF 在Java代码中看起来像这样。 JasperReport compiledReport JasperCompileManager.compileReport(sample.jrxml);
MapString, Object parameters ...;
java.sql.Connection connection dataSource.getConnection();
try {JasperPrint filledReport JasperFillManager.fillReport(compiledReport, parameters, connection);JasperExportManager.exportReportToPdf(filledReport, report.pdf);
} finally {connection.close();
} 多亏了facade类这看起来很简单。 但是外表可能是骗人的 鉴于以上代码段以及概述的三个步骤您认为哪些部分需要最多的时间和内存 听起来像面试问题。 如果您回答2填写数据那是对的 如果您回答了3那也是正确的因为3与2成正比。 恕我直言 大多数在线教程仅显示简单的部分。 就JR而言 似乎缺少对较困难和棘手的部分的讨论。 在这里与Mike的团队一起我们遇到了两个困难内存不足错误和长期运行的报告。 使这些困难特别令人难忘的是它们仅在生产过程中出现而不在开发过程中。 我希望通过共享它们将来可以避免它们。 内存不足错误 第一个挑战是报告内存不足。 在开发过程中与实际操作数据相比我们用于运行报告的测试数据将太小。 因此 为此设计 。 在我们的例子中所有报告都使用JRVirtualizer运行。 这样当达到内存中的页面/对象最大数量时它将刷新到磁盘/文件。 在此过程中我们还了解到虚拟器需要清理。 否则周围会有几个临时文件。 而且只有在报告导出到文件后 我们才能清理这些临时文件。 MapString, Object parameters ...;
JRVirtualizer virtualizer new JRFileVirtualizer(100);
try {parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);...... filledReport JasperFillManager.fillReport(compiledReport, parameters, ...);// cannot cleanup virtualizer at this pointJasperExportManager.exportReportToPdf(filledReport, ...);
} finally {virtualizer.cleanup();
} 有关更多信息请参见Virtualizer Sample – JasperReports 。 请注意当我们在运行报表时遇到内存不足的错误时JR 并不总是罪魁祸首。 有时即使在使用JR之前我们也会遇到内存不足错误。 我们看到了如何滥用JPA来加载报告的整个数据集 Query.getResultList()和TypedQuery.getResultList() 。 同样由于数据集仍然很小因此在开发期间不会显示该错误。 但是当数据集太大而无法容纳在内存中时我们会遇到内存不足错误。 我们选择避免使用JPA生成报告。 我猜我们只需要等待JPA 2.2的Query.getResultStream()可用即可。 我希望JPA的Query.getResultList()返回Iterable 。 这样就有可能一次映射一个实体而不是整个结果集。 现在避免加载整个数据集。 一次加载一个记录。 在此过程中我们返回了良好的JDBC。 不错JR很好地使用了ResultSet 。 长期运行的报告 第二个挑战是长期运行报告。 同样在开发过程中可能不会发生这种情况。 充其量将运行10秒钟左右的报告视为冗长。 但是有了实际的运行数据它可以运行大约5-10分钟。 当根据HTTP请求生成报告时这尤其麻烦。 如果报告可以在超时时间段内通常为60秒或最多5分钟开始写入响应输出流那么它很有可能被请求用户通常是通过浏览器接收。 但是如果填写报告需要5分钟以上的时间而导出到文件又需要8分钟那么用户将只会看到超时的HTTP请求并将其记录为错误。 听起来有点熟 请记住报告可能会运行几分钟。 因此 为此设计 。 就我们而言我们在单独的线程上启动报告。 对于通过HTTP请求触发的报告我们将以一个页面进行响应该页面包含指向所生成报告的链接。 这样可以避免超时问题。 当用户单击此链接而报告尚未完成时他/她将看到仍在生成报告。 但完成的报告时他/她就可以看到生成的报告文件。 ExecutorService executorService ...;
... executorService.submit(() - {MapString, Object parameters ...;try {...... filledReport JasperFillManager.fillReport(compiledReport, parameters, ...);JasperExportManager.exportReportToPdf(filledReport, ...);} finally {...}
}); 我们还必须添加停止/取消运行报告的功能。 好东西JR有检查Thread.interrupted()代码。 因此仅中断线程将使其停止。 当然您需要编写一些测试来进行验证期望JRFillInterruptedException和ExportInterruptedException 。 在讨论过程中我们重新发现了将“监听器”添加到报告生成中的方法例如FillListener和JRExportProgressMonitor 并为用户提供一些进度信息。 我们还创建了实用程序测试类以通过反复重复给定的数据来生成大量数据。 这对于帮助团队的其他成员开发专为处理长期运行和内存不足错误而设计的JR应用程序很有用。 进一步的设计考虑 要考虑的另一件事是填写报告时需要打开和关闭所需的资源。 这可以是JDBC连接Hibernate会话JPA EntityManager或文件输入流例如CSVXML。 下图是我的设计注意事项的粗略草图。 1. Compiling- - - - - - - - - - - - - -\- - - -\ \
2. Filling open-close \- - - -/ resource swap to file/
3. Exporting /- - - - - - - - - - - - - -/ 我们要隔离2并定义装饰器这些装饰器将打开资源填充报告并在finally块中关闭打开的资源。 打开的资源可能取决于报表中的queryString元素如果存在。 在某些情况下如果没有queryString元素则可能无需打开资源。 queryString languagehql![CDATA[ ... ]]
/queryString
...
queryString languagecsv![CDATA[ ... ]]
/queryString 此外我们还希望将2和3组合为一种抽象。 这种单一的抽象使您可以更轻松地进行增强装饰例如将创建的页面对象刷新为文件并在导出过程中将其加载回。 如前所述这就是JRVirtualizer所做的。 但是我们希望使用结合2和3的抽象对对象透明的设计。 致谢 目前为止就这样了。 再次感谢Mike和他的团队分享了他们的经验。 是的他是将自己应用的收入捐赠给慈善机构的那个人 。 另外还要感谢克莱尔Claire通过一次又一次重复给定数据进行测试的想法。 相关代码段可以在GitHub上找到 。 翻译自: https://www.javacodegeeks.com/2018/01/jasperreports-tricky-parts.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83060.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!