BIRT报告数据库设置为参数,但参数需要数据库吗?

时间:2014-08-27 13:45:01

标签: mysql database eclipse parameters birt

我有一种感觉,我在这里遇到了陷入困境的情况,但是我希望至少有人找到解决办法!

我正在处理的BIRT报告的数据库是通过一个名为db的隐藏参数传入的,因此在我的报告的数据源中。所以在Property Binding下,我告诉BIRT使用"jdbc:mysql://localhost/" + params["db"].value作为JDBC驱动程序URL。这应该使用在浏览器中运行时从URL传入的数据库名称,这是我在网上找到的解决方案,用于在具有不同数据库名称的计算机上运行我们的报告。

enter image description here

我的问题是,在相同的报告参数中,用户必须从来自数据库的公司列表中选择公司。但报告不能填充此列表,因为数据库没有加载,直到我在参数窗口按OK,直到他们选择公司才能完成,呃 - 我发现自己有一个捕获22的情况!

enter image description here

我不知道在这种情况下我想做什么,如何让报告首先加载数据库,然后根据它显示参数屏幕?

2 个答案:

答案 0 :(得分:2)

据我所知,我们不能这样做,因为除了级联参数外,BIRT中的两个报告参数之间没有依赖机制。在这种情况下,这意味着当评估“公司”的项目列表时,参数“db”的选定值永远不可用。

因此,应使用不同的方法提供数据库。你有几个选择:

选项1:会话属性(如果您使用应用程序服务器)

将所选数据库存储在用户会话属性中,然后使用以下表达式在JDBC URL的属性绑定中检索它:

reportContext.getHttpServletRequest().getSession().getAttribute("db");
  • 优势1:每个用户的数据库可以不同
  • 优势2:可以为每个用户动态更改数据库
  • 缺点:需要开发一个小型servlet,允许选择数据库并将其存储在用户会话中

选项2:连接池(如果您使用应用程序服务器) 这应该始终是使用BIRT访问JDBC数据源的最佳方式。我们只需填写数据源中的JNDI URL(参见上面的第一个屏幕)。物理数据库URL和凭据在连接池中的每个应用程序服务器上定义。

  • 优势1 :完全原生,没有具体可供开发
  • Advantage 2 :连接池比直接访问JDBC
  • 更有效
  • Advantage 3 :连接池可防止“连接太多”问题
  • Advantage 4 :我们不必硬编码数据库URL&报告中的凭证
  • 缺点:此JNDI网址由所有用户共享。

访问this article以查看使用BIRT连接池的示例。

选项3:在属性文件中外部化数据库

正如您所提到的,数据库信息也可以在文件中外部化。

  • 优势1 :我们不必硬编码数据库网址&报告中的凭证
  • Advantage 2 :我们还可以开发一个小型servlet来通过GUI更新此属性文件
  • 缺点:此数据库由所有用户共享。

请检查this topic,了解如何通过报告资源访问属性文件

选项4:连接个人资料商店

  • 优势:我们不必硬编码数据库网址&报告中的凭证
  • 缺点:此数据库由所有用户共享。

请检查this topic以了解如何定义连接存储

答案 1 :(得分:0)

为了别人的利益在这里回答我自己的问题。此问题的最佳解决方案是使用此stackoverflow线程link中所述的外部连接配置文件属性文件。这对我们来说最初没有用,因为我无法弄清楚如何使报告文件查找属性文件,无论它运行在哪台计算机上。但是我发现在加载/保存属性文件时可以指定绝对路径(对于BIRT 4.4.0,这是在数据源连接配置文件下的浏览按钮旁边的下拉列表中)。这允许在任何计算机上以相同的绝对路径保存文件时读取该文件。

另一个需要注意的重要事项是BIRT有一种奇怪的习惯,即改变它将使用的3种加载数据源的方法中的哪一种。在我们的测试过程中,我们发现如果在使用连接配置文件时我们没有将属性绑定设置留空,BIRT似乎随机选择通过参数加载或通过基于最后编辑的属性文件加载,非常混乱!< / p>

使用参数指定数据库仍然是可能的,它的使用非常有限。到目前为止,它对我们起了作用,因为虽然我们将数据库设置为参数,但始终在JDBC中设置相同的数据库,该报告用于填充公司参数。但我们不再需要手动设置该数据库,现在它将自动加载而没有任何问题(希望!)。