2014-08-27 67 views
2

我有一种感觉,我在这里的catch-22情况,但我发布,希望有人已经找到了解决方法,至少!BIRT报告数据库设置为参数,但参数需要数据库吗?

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

enter image description here

我的问题是,在同一份报告中的参数,用户必须从来自数据库的公司列表中选择一个公司。但是报告不能填充这个列表,因为直到我按下参数窗口上的确定之后数据库才被加载,直到他们选择了一家公司才能完成,呃,哦,我发现自己有一个catch-22的情况!

enter image description here

我不知道,我想在这种情况下做的,我怎么能得到的报告首先加载数据库,然后显示基于它的参数屏幕?

+2

由于张贴这个问题,看来我将不得不采取类似在这里发表路线:[链接](HTTPS://www.eclipse .org/forums/index.php/mv/msg/235486/716568 /#msg_716568)使用带数据库信息的外部属性文件,并利用beforeOpen加载它。我之前创建了一个属性文件,但是我不确定2件事:在我们的计算机上保存该属性文件的位置,以及如何将此代码指向它?如果有人能够澄清对我来说这将是非常感谢,我会张贴这个答案,然后如果它的作品供将来参考。 – logicalfox 2014-08-28 10:08:45

回答

2

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

因此,应该使用不同的方法提供数据库。你有一对夫妇选择这里:

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

存储在用户会话属性选择的数据库,然后检索它的属性绑定

reportContext.getHttpServletRequest().getSession().getAttribute("db"); 
  • 优势1:的JDBC URL用这种表达的的数据库可以是对每个用户不同
  • 优点2:数据库可以动态地改变对于每个用户
  • 缺点:需要开发一种小的servlet允许选择数据库并将其存储在用户会话

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

  • 优势1:完全天然,没有什么具体的待开发
  • 优势2:连接池是要比直接访问更加高效的JDBC
  • 优势3:连接池防止“太多连接“问题
  • 优势4:我们不必硬编码数据库URL &凭证在回购rts
  • 缺点:此JNDI URL由所有用户共享。

请访问this article查看与BIRT一起使用连接池的示例。

方案3:外部化DB属性文件中

正如你mentionned数据库的信息,也可以在一个文件中外部化。

  • 优势1:我们没有硬编码数据库URL &凭据在报告
  • 优势2:我们也可以通过GUI
  • 开发一个小型的servlet来更新这个属性文件
  • 缺点:此数据库由所有用户共享。

请检查this topic看看如何访问一个属性通过报告

方案4的资源文件:连接配置文件存储

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

请检查this topic看如何定义连接存储

+0

谢谢,回答非常明确 – logicalfox 2014-09-01 08:18:35

0

在这里回答我自己的问题,为他人着想。此问题的最佳解决方案是使用此堆栈溢出线程link上所述的外部连接配置文件属性文件。这最初并不适用于我们,因为我不知道如何使报告文件查找属性文件,而不管它运行在哪台计算机上。但是,我发现可以在加载/保存属性文件时指定绝对路径(对于BIRT 4.4.0,这位于数据源的连接配置文件下的浏览按钮旁边的下拉列表中)。这允许文件在任何计算机上被读取,一旦它被保存在相同的绝对路径下。

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

使用参数来指定数据库仍然是可能的,但它的使用量非常有限。直到这一点,它一直在为我们工作,因为虽然我们将数据库设置为参数,但始终在报告用于填充公司参数的JDBC中设置相同的数据库。但我们不再需要手动设置数据库,现在它会自动加载而没有问题(希望!)。