【问题标题】:How to use efficient java in memory database to mock Oracle database如何在内存数据库中使用高效的java来模拟Oracle数据库
【发布时间】:2013-01-28 07:44:52
【问题描述】:

我有很多访问数据库的 DAO 测试。 我试图在 H2 等内存数据库中使用 Java 来模拟它们。 但问题是 ddl 脚本包含 H2 似乎不支持的分区语句。 我基本上想使用与生产中相同的 ddl 脚本,并且不想以任何方式为我的“单元”测试修改它们。 我也尝试过 HSQL,但发现 H2 更类似于 oracle,但即便如此它也不支持分区。 有解决办法吗?

我确实看过以下内容 Create an in-memory database structure from an Oracle instance 它谈到了使用 H2,但我已经提到了它的缺点。 寻找一些替代品。

【问题讨论】:

  • 如果您想要进行有意义的测试,您不能模拟 Oracle 数据库(或任何 DBMS)。设置运行测试的测试实例。顺便说一句:如果您实际上是在谈论 partitioningwindow functions(使用 over(partition by ..,您应该提及
  • +1 @a_horse_with_no_name 的评论。每个数据库的语法略有不同,最好设置一个 oracle 的测试实例
  • @MiserableVariable 这取决于 DAO 的复杂性以及您要测试的内容。如果 DAO 只做简单的 CRUD 操作,那么 H2 对于 unit 测试来说已经足够了。但我同意也应该在 Oracle 上运行测试(即集成测试)。
  • 正确,如果您的程序使用的 SQL 功能以相同的方式被 H2 和 Oracle 支持,即没有任何细微差别,则通常可以使用 H2。如果您使用的是 OR 映射库/框架,它也可能没问题。但在实践中,我发现有必要在生产中使用实际的数据库服务器

标签: java oracle11g h2


【解决方案1】:

如果您想要有意义的测试,则需要针对与您在生产环境中运行的数据库版本相同的实例运行它们。

【讨论】:

    【解决方案2】:

    您可以使用 Oracle 的数据字典生成包含表、它们的关系、索引、约束等的 H2 模式。我正在使用这样生成的模式来测试内存中的 H2 数据库。

    例如要获取所有表及其列,您可以使用以下查询:

    SELECT 
      ut.table_name,
      utc.column_name,
      utc.data_type,
      utc.data_length,
      utc.data_precision
      FROM user_tables ut JOIN user_tab_columns utc
        ON ut.table_name = utc.table_name;
    

    可以对外键、其他约束、索引、序列以及测试所需的所有其他内容进行类似查询。您还需要一个模板引擎来将查询结果转换为 H2 DDL 脚本。

    【讨论】:

    • 但这仍然不会“实现”对窗口函数或 Oracle 特定 SQL 扩展的支持。
    • @a_horse_with_no_name 不,但至少它解决了 Oracle 特定 DDL 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多