【问题标题】:Does Spring embedded database support different SQL dialects?Spring 嵌入式数据库是否支持不同的 SQL 方言?
【发布时间】:2012-02-28 14:44:57
【问题描述】:

H2 有一系列compatibility modes 用于支持不同 SQL 方言的各种其他数据库,例如 MS SQL Server、MySQL、Oracle 等。但是,在 Spring 中设置 embedded database 时,我没有找到任何相应的设置。这是否意味着如果我在生产中使用 Oracle 并在测试期间使用 H2,我必须使用没有任何方言特定功能的“普通”SQL?我忽略了什么吗?

【问题讨论】:

    标签: java spring h2 embedded-database


    【解决方案1】:

    根据H2 doc,Oracle的兼容模式相当有限。

    例如,您不能使用 PL/SQL 过程。

    如果使用 Spring 的 EmbeddedDatabase,则无法按原样设置兼容模式;您必须实现自己的EmbeddedDatabaseConfigurer 并通过JDBC URL 指定兼容模式(见下文)。

    而且,要使用 H2 和 Spring 的兼容模式,您只需使用 DataSource 以经典方式在 JDBC URL 中设置模式(因此它与 Spring 无关):

    jdbc:h2:~/test;MODE=Oracle
    

    如果你使用 Hibernate,你必须指定 Oracle 方言而不是 H2 方言。

    【讨论】:

      【解决方案2】:

      哪个版本的H2数据库?根据文档,您可以通过 SQL 语句设置兼容模式 (http://www.h2database.com/html/features.html#compatibility)

      SET MODE PostgreSQL
      

      只需将此语句添加到 Spring jdbc 嵌入式数据库加载的第一个 sql 脚本文件中

      【讨论】:

        【解决方案3】:

        你有两个选择:

        1. 使用spring启动H2数据库如下(查看setName()查看如何将H2特定的URL参数传递给spring builder):

        Spring 代码生成 URL 如下:

        String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1", databaseName)

        因此,在 setName() 中,您可以在 URL 中使用任何 H2 特定参数。

        private DataSource dataSource() {
            EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
            EmbeddedDatabase db = builder
                .setType(EmbeddedDatabaseType.H2)
                .setName("testdb;DATABASE_TO_UPPER=false;MODE=Oracle")
                .addScript("schema.sql")
                .addScript("data.sql")
                .build();
            return db;
        }
        
        1. 直接配置DB URL,比如:

          org.h2.jdbcx.JdbcDataSource dataSource = new org.h2.jdbcx.JdbcDataSource(); dataSource.setURL("jdbc:h2:testdb;MODE=MySQL;DATABASE_TO_UPPER=false;INIT=runscript from 'src/test/resources/schema.sql'\;runscript from 'src/test/resources/data.sql'" );

        主要区别在于 (2) 为每次创建数据库连接执行在 INIT 中定义的脚本,而不是每次创建数据库一次!这会导致各种问题,例如由于重复键等导致 INSERT 失败。

        【讨论】:

          猜你喜欢
          • 2011-05-12
          • 2012-08-10
          • 2016-01-05
          • 2017-11-18
          • 2019-08-02
          • 2017-02-12
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多