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方言。
您有两个选项:
- 使用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;
}
直接配置数据库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由于密钥重复等而失败。