2

我需要在我的网站上构建一个报告部分,其中包含一些相当复杂的查询,包括 UNION、GROUP_CONCAT 等。到目前为止,JPA 与我的实体的集成保持了数据库的独立性。目前系统使用 MsSQL,但我们希望稍后我们可以根据需要切换到 Postgres 或 MySQL。

使用这些报告有什么好的方法,这样我就可以在 MySQL 或 Postgres 上运行而不需要太多工作?

该站点还使用 Spring

4

3 回答 3

2

正如我所看到的,您的问题或多或少是“我如何在不与该供应商联系的情况下利用供应商特定的功能?”。

这导致不容易回答;可能最灵活的方法是坚持使用 JPA 并吸收性能损失。

其他可能性:

  • 将报告定义为发布一组接口的组件。使用 CDI 注入与您选择的数据库相关的实现

  • 上面的一个变体,设置你自己的 DAO 接口来访问数据。就像另一个更具体的 ORM 框架一样,它可以具有更好的性能。在此基础上构建报告。

  • 如果您的业务允许,请选择 RDBM 用于报告。在夜间(如果没有太多数据,甚至可以按需使用),将您的生产数据库转储到其中。

于 2012-08-31T15:32:03.220 回答
0

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

使用 Spring,很容易在 DAO 实现类之间交换作为配置选项,例如,如果您有一个CustomerDao具有 Oracle 和 DB2 实现的接口,则使用以下任一种:

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

或者

<bean id="customerDao" class="my.package.customer.Db2CustomerDao"/>
于 2012-08-31T18:29:05.433 回答
0

如果您希望您的 SQL 跨多个数据库工作,那么您可以遵循以下计划:

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

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

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

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

于 2012-08-31T20:40:20.243 回答