【问题标题】: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 方言。
【解决方案3】:
你有两个选择:
- 使用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;
}
-
直接配置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 失败。