Spring嵌入式数据库支持不同的SQL方言吗



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

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

SET MODE PostgreSQL

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

根据H2文档,Oracle兼容模式非常有限。

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

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

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

jdbc:h2:~/test;MODE=Oracle

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

您有两个选项:

  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. 直接配置数据库URL,如

    org.h2.jdbcx.JdbcDataSource dataSource=新建org.h2.jdcx.JdbcData();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由于密钥重复等而失败。

最新更新