Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 封装SQL平台之间差异的策略?_Java_Sql_Encapsulation_Robustness - Fatal编程技术网

Java 封装SQL平台之间差异的策略?

Java 封装SQL平台之间差异的策略?,java,sql,encapsulation,robustness,Java,Sql,Encapsulation,Robustness,我正在加速一些缓慢的操作,其中一个例子是表中的父子关系树。目前该系统运行在SQLServer上,经过一些研究,我发现使用通用表表达式可以将多个查询压缩为一个查询 到目前为止还不错,但是语法是特定于SQLServer的,使用(例如)Oracle做同样的事情需要完全不同的语法 可以做些什么来构建系统,以便将来适应其他RDBMS?我主要关注的是: SQL语句散落在代码中,一个RDBMS中的一个语句可能需要另一个RDBMS中的多个语句,因此,即使是程序逻辑也可能需要更改 甚至可以很好地封装在一个RDB

我正在加速一些缓慢的操作,其中一个例子是表中的父子关系树。目前该系统运行在SQLServer上,经过一些研究,我发现使用通用表表达式可以将多个查询压缩为一个查询

到目前为止还不错,但是语法是特定于SQLServer的,使用(例如)Oracle做同样的事情需要完全不同的语法

可以做些什么来构建系统,以便将来适应其他RDBMS?我主要关注的是:

  • SQL语句散落在代码中,一个RDBMS中的一个语句可能需要另一个RDBMS中的多个语句,因此,即使是程序逻辑也可能需要更改
  • 甚至可以很好地封装在一个RDBMS中的东西(我使用存储函数来隐藏数据库中的一些复杂性)在不同的数据库中也有细微的差别,或者根本不可用
到目前为止,我觉得超出最简单的SQL语句之外的所有内容似乎都需要特定于供应商的扩展,因此不可能将差异整齐地隐藏在几个类/存储的SQL语句中(当然,我们可以使用一个已经内置了大部分抽象的框架,但这也排除了DB的许多更有用的功能)

什么策略可以用来至少缓解供应商差异带来的痛苦?我知道这是一个非常广泛的问题,没有万能的答案。但我希望有一些指针和模式来减少DB对应用程序的影响

编辑:实现语言是Java,简单地使用ORM(如Hibernate)不是我想要的(或多或少需要重写约50%的代码库)

EDIT2:我主要寻找以尽可能通用的兼容方式将细节推送到数据库中的可能性,理想情况下,我希望java部分使用的SQL对于所有平台都是相同的(或者由于语法差异只需要非常轻微的更改).对于我给出的CTE示例,我目前将其推出到存储函数中,希望在需要移植时,功能也可以在函数中重现

EDIT3:目前我并不迫切需要支持其他RDBMs。如果它只与SQLServer一起工作,没有人会责怪我。但在可能的情况下,我希望避免将java代码过度绑定到特定的数据库供应商


EDIT4:一些背景-目前的工作是向系统添加功能-功能不是设计的,也不是计划的。需求从业务人员一点一点地进入,很难提前计划。虽然每个需求本身并不很难解决,但我担心我们会积累一大堆标记的东西这是不可能在不仔细检查每个查询的情况下进行移植的。由于SQLServer本身也在每个主要的新版本中引入了各种与自身不兼容的问题,因此我担心,即使切换到较新的SQLServer,也可能成为未来的一个主要障碍(从2005年到2008年,我们做了一次这样的升级——我正在维护的东西进行得很顺利,但这已经给我们的一家供应商带来了很多问题).

您没有指定yuo使用的应用程序平台。但我假设您使用的是.Net或Java。您的第一道防线是在应用程序的SQL语句中使用ODBC或JDBC转义序列,并将此方法无法处理的任何内容推送到存储过程中

如果您有一个许可证来对应用程序进行更彻底的重构,您应该考虑为应用程序平台切换到ORM库。

编辑:我看到你编辑了你的问题,澄清了你正在使用Java,切换到ORM库不是一个选项。很久以前,我正在为大型企业客户开发一个产品。每个客户都有他们的标准参考体系结构,所以我们必须适应Oracle、Microsoft SQL Server和UDB/DB2。我们可能支持其他平台,但一些细节在10-12年后会变得模糊。我们通过虔诚地使用JDBC Escape进行时间常数、函数和存储过程调用,并将更敏感的操作推送到特定于数据库的存储过程中,实现了这一点。因此,根据我的经验,我可以告诉您,这种方法ach是有效的。目前,通过一系列收购,该产品是Oracle中间件产品组合的一部分,因此我甚至不知道它是否还支持Oracle的其他产品

我的另一次经历是在一个大型数据仓库项目中。在这种情况下,我们大量使用Oracle特有的功能,因此根本不可能迁移到另一个数据库平台


因此,我的建议是评估使用特定于SQL Server的功能是否是应用程序固有的。如果是,您应该接受迁移到另一个平台不是一个不进行重大重写的选项。如果不是,请查看是否可以通过使用JDBC转义来改善围绕SQL的精神状态。

您没有指定什么应用程序yuo正在使用的平台。但我假设您使用的是.Net或Java。您的第一道防线是在应用程序的SQL语句中使用ODBC或JDBC转义序列,并将此方法无法处理的任何内容推送到存储过程中

如果您有一个许可证来对应用程序进行更彻底的重构,您应该考虑为应用程序平台切换到ORM库。

编辑:我看到你编辑了你的问题,澄清了你正在使用Java,切换到ORM库不是一个选项。很久以前,我正在为大型企业客户开发一个产品。每个客户都有他们的标准参考architec