3

我有一个以 Informix 作为其后端数据库的 Java Web 应用程序。我的架构中的许多表都包含 CLOB、BLOB 和 SERIAL8 类型的列。现在我决定使用 SQL Server 而不是 Informix,但我发现将上述数据类型转换为相应的 SQL Server 时出现问题,例如当我转向使用 DB2 或 Oracle 时,我也会遇到同样的问题。匹配表之间关系的问题,因为每个数据库供应商都有自己的关系表示。

有没有办法设计我的应用程序和数据库模式,以便它可以与任何数据库服务器交互,而不管其类型如何并且不更改列数据类型?我听说过DDLUtilsjOOQ,但我不知道它们是否适合我

4

5 回答 5

2

好的,您可以在这里执行多个抽象级别:

首先,您需要将所有数据访问代码集中到独立实现中,并且仅通过接口访问这些代码,这些接口以仅适用于您的应用程序且不受底层数据存储设计影响的格式为您提供所需的数据。

例如,如果您想从某个客户订单中获取零件,请确保您用来查找的方法是处理对象的“业务 ID”的方法,因为实际 ID 在关系数据库中可能很长,但NoSQL 中的 UUID。

通过应用这一点,您将不受数据存储范式的束缚,您可以在平面文件、内存存储、NoSQL 和常规关系数据库实现之间自由切换。

其次,尝试使用像Hibernate这样的 ORM 。这允许您使用通用查询语言编写,并且在大多数情况下仅将数据库特定更改限制为配置更改。

第三,如果您需要直接编写 SQL 查询,请确保您编写的是 ANSI 查询而不是特定于数据库的查询,即使您确实要确保这些查询不是您的代码的一部分,而是资源(即属性文件)的一部分,以便您可以根据需要调整和更改它,而无需重新编译二进制文件。

于 2012-07-05T08:13:51.790 回答
1

由于它是一个 Java 应用程序,因此您可以迁移到诸如Hibernate之类的ORM层,该层将抽象数据库详细信息。

Hibernate 支持 20 多个具有现有方言的数据库,创建自己的数据库并不难。为了与旧版 Informix SE 7.32 数据库兼容,我不得不这样做。

于 2012-07-05T03:11:47.427 回答
1

既然您提到了 jOOQ,我可以根据您的需求为您提供一些关于该工具可以实现什么以及不可以实现什么的见解。使用 jOOQ,您可以:

  • 从模型数据库模式生成源代码。这些生成的模式对象与 SQL 方言无关。如果您在模型数据库模式中使用供应商特定的类型,这可能意味着您可能会丢失一些类型信息。
  • 编写将在各种数据库上运行的 SQL。jOOQ 处理您的特定于 SQL 方言的事情。许多 jOOQ 用户使用 jOOQ 针对 [Oracle, Postgres], [Oracle, SQL Server, HSQLDB, Sybase] 等组合运行应用程序。

使用 jOOQ,您不能:

  • 处理所需的 DDL,以便在各种数据库之间保持兼容。jOOQ 不支持 DDL 抽象。不过, DdlUtils可能是一个很好的解决方案。
  • 使用 Informix。正式地,不支持 Informix(尚)

正如其他人所指出的那样,根据您真正想要做的“SQL”有多少,Hibernate可能是一个更好的选择。如果您准备将查询需求减少到 HQL 或 JPQL,那么 Hibernate 还可以处理:

  • Informix SQL 方言支持
  • 如果您使用域模型优先方法,则生成 DDL(与 jOOQ 不同,它仅支持数据库模型优先方法)

注意,您也可以结合使用 Hibernate 和 jOOQ。另请参阅此相关问题:

用于仅插入/仅查询应用程序的 ORM 框架

于 2012-07-08T14:37:17.057 回答
0

实现基于 SQL 的数据独立性的唯一方法是使用 ANSI SQL,但这可能无法为您的应用程序需求提供足够的功能。

即使您要使用 JDBC 并将您的 SQL 语句保持在外部,我认为它也不可能实现基于 SQL 的数据库独立性。我认为 ANSI SQL 是朝着这个目标迈出的一步,但是 DB 供应商添加了他们自己的:ANSI SQL 的超集、数据类型、变量命名语法等。

于 2012-07-05T02:01:57.393 回答
0

您使用独立于数据库的 API(即 JDBC)来编写代码,但将 SQL 保存在外部文本文件中;键/值格式很方便。在运行时,您加载给定数据库所需的查询。

于 2012-07-03T21:50:32.773 回答