如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?
Posted
技术标签:
【中文标题】如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?【英文标题】:How to emulate Oracle (+) outer join notation in in-memory database used to run Java unit tests? 【发布时间】:2013-05-16 12:54:16 【问题描述】:我们使用 HSQLDB 和 Oracle 数据库语法 (jdbc:hsqldb:mem:TestDB;sql.syntax_ora=true) 进行数据层单元测试。
(我们意识到这并不理想,如果我们可以针对实际的 Oracle 数据库进行测试会更好。但这不是一个选项,因为我们希望确保我们可以在任何地方运行我们的自动化测试。在后面的步骤中,所有查询也在实际 Oracle 数据库的集成测试中进行测试,该数据库的设置类似于生产数据库。)
有什么方法可以支持使用 HSQLDB 进行查询的 Oracle 外连接 (+) 表示法?
在我看来,我们不应该使用 (+) 表示法,而是使用标准的外连接表示法。但是,负责调整查询的人使用这种表示法,因此与他们的沟通会变得更加困难/容易出错。 虽然如果没有找到解决方案可能是一种选择,但这不是这里的问题。
我找到了以下线程: http://comments.gmane.org/gmane.comp.java.hsqldb.user/5756 使用那里提到的 QueryRewrite 补丁,我将有必要的钩子来自己处理 (+),但该接口从未进入官方 HSQL 版本。
对于 HSQL 是否有另一种解决方法?
我们可以在单元测试本身的某处添加查询重写(而不是在测试数据库级别),但如果我们能避免这种情况会更好。
如果没有 HSQL 的解决方法,是否有任何其他可从 jar 启动的内存数据库/数据库,支持这种 (+) 外连接表示法?
【问题讨论】:
【参考方案1】:我认为您已经在问题中引用了所有“简单”的可能性。
因此,剩下的唯一方法是在将查询发送到 HSQLDB 之前在代码中重写查询。
将查询编写为不使用 (+) 符号,然后为您的数据库调谐器重写它们(使用脚本)应该更简单。这种重写应该比其他方向更容易,因为标准符号在其结构中包含更多信息。
【讨论】:
【参考方案2】:不要使用它。有时,Oracle 优化器以不同的方式处理这两种语法。从 11g 开始,它已经结束了,没有理由坚持这种语法。
但无论如何,Oracle 有另一个 SQL 语法增强功能 - 例如分析查询。也许您应该使用 OracleXE 进行自动化测试。
【讨论】:
以上是关于如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?的主要内容,如果未能解决你的问题,请参考以下文章