Spring嵌入式数据库是否支持不同的SQL方言?

mat*_*sev 13 java spring h2 embedded-database

H2具有一系列兼容模式,适用于支持不同SQL方言的各种其他数据库,如MS SQL Server,MySQL,Oracle等.但是,在Spring中设置嵌入式数据库时,我找不到任何相应的设置.这是否意味着如果我在生产中使用Oracle而在测试期间使用H2,那么我必须使用没有任何方言特定功能的"普通"SQL?我忽略了什么吗?

sko*_*ong 15

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

SET MODE PostgreSQL
Run Code Online (Sandbox Code Playgroud)

只需将此语句添加到Spring jdbc embedded-database加载的第一个sql脚本文件中


nde*_*rge 13

根据H2 doc,Oracle兼容模式非常有限.

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

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

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

jdbc:h2:~/test;MODE=Oracle
Run Code Online (Sandbox Code Playgroud)

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


Vas*_*lis 6

您有 2 个选择:

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

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;
}
Run Code Online (Sandbox Code Playgroud)
  1. 直接配置数据库 URL,例如:

    org.h2.jdbcx.JdbcDataSource 数据源 = 新的 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 中定义的脚本,而不是每个数据库创建一次!这会导致各种问题,例如由于重复键等导致插入失败。