使用Java / JSP / Servlet生成Jasper报告的最佳方法

时间:2015-11-09 08:06:05

标签: java performance jasper-reports

场景 - 用户输入(日期范围,报告类型)取自JSP页面&传递给servlet然后传递给java。

我想问一下我是否应该 -

  1. 在java&中使用mysql查询然后使用Hashmap将值放在jasper中? 或
  2. 在jasper本身使用mysql查询&只使用java提供数据连接?
  3. 主要关注的是哪种方法在性能,稳健性和未来变化方面更好?

3 个答案:

答案 0 :(得分:0)

那么你的问题是如此笼统。您的方法和业务模式是什么?如果你的查询有如此多的复杂性,似乎最好直接在jasper中使用sql,它比使用jasper中的值生成报告更快。但是在编程范例中,只有一个模块可以了解数据库连接,这是程序的域边。我更喜欢不在jasper配置中初始化数据库连接,所以只需使用jasper中的值并使用Hashmap映射它们。您可以在程序中使用先前的连接和数据库模块(用于实体或域对象的模块)并获取所需数据并将其映射到报告

答案 1 :(得分:0)

  

在java&中使用mysql查询然后使用Hashmap将值放在jasper中?

这听起来很疯狂,纯Hashmap不是数据源,因此您无法对其进行迭代。

您的解决方案可以是:

  
      
  1. 在java&中使用mysql查询然后将值放在JRDatasource中,将数据源传递给jasper report

  2.   
  3. 在jasper本身使用mysql查询&只使用java提供数据连接

  4.   
  5. 在java中生成mysql查询并将查询和数据连接传递给jasper报告

  6.   
  1. 我将使用的唯一方案是,无法从单个查询中以简单的方式提取数据,所有数据在查询中都不可用,或者数据已在内存中可用(例如用户已选择)表中的行。)

  2. 开发报告时,这是正常的"并且可能是最快的,像iReport这样的工具,使您可以自动从查询中提取字段并使用实时数据连接预览报表(您无需编译和运行代码)。这样,报表的开发人员也独立,在大型项目中非常有用。

  3. 当查询到达复杂的位置(取决于多个变量)时,查询可以直接作为参数(或多个参数)传递。在报告中,可以使用查询的默认表达式来获得2的优势。

  4. 通常你使用 metod 2。

    性能:如果数据已经在内存1中更快(没有sql),否则你可能只会占用更多内存(因此当你加载JRDataSource时)。但是我没有做过任何广泛的测试。

    健壮性,更多地取决于您的代码然后使用的方法

    未来的变化,2具有只在一个地方进行更改的优势"报告",您甚至不需要打开java项目。

答案 2 :(得分:0)

如果我的理解是正确的,应用程序会为用户选择报告过滤器。这些过滤条件在HTTP Servlet Request中传递给应用程序,您想在

之间进行选择
  1. 在<中提供查询。 queryString>和jrxml设计文件中的字段映射,只需要从java传递的where条件参数
  2. 在java中实现报表内容检索并将java bean传递给jrmxl文件
  3. 我建议与项目的整体后端设计策略保持一致,以便从数据库中获取数据。

    如果您的报告相对简单且应用程序已经具有完全成熟的ORM实现,请使用第二种方法。这在初始实现以及任何未来的变更请求的实现方面都相对简单。

    如果不是这种情况,并且用于生成报告的SQL查询是动态且相当复杂的,我仍然建议继续使用选项2.

    • 在java中编写用于报表数据检索的查询(字符串构建器),或者将它们保存为DB
    • 中的函数/过程
    • 填充java bean的集合并将其传递给jasper report engine

    只要应用程序在具有不错规格的应用服务器上运行,这两种方法都可能没有任何显着的性能差异。 如果性能至关重要且当前的服务器资源有限,我建议   - 在单独的JVM中将报告作为单独的应用程序运行   - 单独的报告和应用程序数据库服务器并使用数据库复制工具    同步数据。生成庞大的复杂报告往往会变慢    很好地降低了应用程序的性能。