如何让我的webApp在不同的DBMS之间顺利切换(数据库独立)



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

有没有办法设计我的应用程序和数据库架构,以便它可以与任何数据库服务器进行交互,无论其类型如何,也无需更改列数据类型?我听说过DDLUtils和jOOQ,但我不知道它们是否适合我

好的

,你可以在这里做多个抽象级别:

首先,您需要将所有数据访问代码

集中到独立实现中,并且仅通过接口访问这些代码,这些接口以仅应用程序的格式提供所需的数据,并且不受基础数据存储设计的影响。

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

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

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

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

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

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

既然你提到了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 不同,jOOQ 仅支持数据库模型优先方法)

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

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

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

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

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

最新更新