2012-08-31 29 views
2

我需要构建我的站点的报告部分,其中包含一些复杂的查询,包括UNION,GROUP_CONCAT等。与我的实体的JPA集成迄今保持了数据库独立性。目前系统使用MsSQL,但我们希望稍后确定,如果需要,可以切换到Postgres或MySQL。如何使站点数据库独立报告部分

对这些报告采取什么样的好方法,以便在没有太多工作的情况下,我可以使它适用于MySQL或Postgres?

该网站还使用了Spring

回答

2

在我看来,你的问题是或多或少的“我怎么能利用供应商的特定功能,而不会被绑定到该供应商?”。

这个结果不是一个简单的答案;可能最灵活的就是坚持JPA并吸收性能。

其他可能性:

  • 定义一个发布一组接口的报告,作为一个组成部分。使用CDI注入与您选择的数据库相关的实现

  • 上述变体,设置您自己的数据访问DAO接口。像另一个更具体的ORM框架可以有更好的性能。最重要的是建立报告。

  • 如果您的业务允许,选择一个RDBM来处理报表。在夜间(甚至可以根据需要,如果没有太多数据),将生产数据库转储到其中。

0

最好的选择是使用data access objects,每个数据库一个,每个符合一个通用接口。任何客户端代码都可以使用通用DAO接口,而无需了解底层数据库。

使用Spring,很容易在DAO实现类之间交换配置选项,例如,如果你有一个CustomerDao接口,具有Oracle和DB2的实现,然后使用:

<bean id="customerDao" class="my.package.customer.OracleCustomerDao"/> 

<bean id="customerDao" class="my.package.customer.Db2CustomerDao"/> 
0

如果你希望你的SQL跨多个数据库工作,那么这里就是你可以按照计划:

  1. 测试跨多个数据库
您的SQL

为了获得可移植性,您需要编写可移植的SQL。确保SQL可移植性的唯一方法是检查它的可移植性。

如果你坚持使用标准的SQL,那么这应该是相当简单的;你将无法使用特定于数据库的功能,但是如果没有它们,你可以做很多事情(它们主要是语法糖,或者是跨越关系模型,你希望不需要这样做) 。如果你已经误入了使用非标准的SQL,那么可能很难明确你可以做到这一点,但如果你开始以一种严谨的方式工作,我会对你坚持标准的能力持乐观态度。

如果您正在使用SQL Server,PostgreSQL将是第二个数据库测试的好选择,因为它免费,易于设置且功能非常强大。