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