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

时间:2012-02-07 06:07:52

标签: java spring h2 embedded-database

对于支持不同SQL方言的各种其他数据库(如MS SQL Server,MySQL,Oracle等),H2的范围为compatibility modes。但是,在Spring中设置embedded database时,我找不到任何相应的设置。这是否意味着我必须使用" plain"如果我在生产中使用Oracle而在测试期间使用H2,那么没有任何方言特定功能的SQL?我忽略了什么吗?

3 个答案:

答案 0 :(得分:15)

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

设置兼容模式
SET MODE PostgreSQL

只需将此语句添加到Spring jdbc embedded-database

加载的第一个sql脚本文件中

答案 1 :(得分:13)

根据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 :(得分:4)

您有两个选择:

  1. 使用spring启动H2数据库,如下所示(检查setName()以查看如何将H2特定的URL参数传递给spring builder):
  2. Spring代码生成URL如下:

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

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

    instances=10000
    1. 直接配置数据库网址,如:

      org.h2.jdbcx.JdbcDataSource dataSource = new org.h2.jdbcx.JdbcDataSource();            dataSource.setURL(“jdbc:h2:testdb; MODE = MySQL; DATABASE_TO_UPPER = false; INIT =来自'src / test / resources / schema.sql的脚本'\;来自'src / test / resources / data.sql'的脚本'” );

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