Поддерживает ли встроенная база данных Spring разные диалекты SQL? - PullRequest
13 голосов
/ 07 февраля 2012

H2 имеет диапазон режимов совместимости для различных других баз данных, таких как MS SQL Server, MySQL, Oracle и т. Д., Которые поддерживают различные диалекты SQL.Однако при настройке встроенной базы данных в Spring я не вижу соответствующих настроек.Означает ли это, что я должен использовать «простой» SQL без каких-либо специфических особенностей диалекта, если я, например, использую Oracle в производстве и H2 во время тестирования?Я что-то упустил?

Ответы [ 3 ]

15 голосов
/ 24 июня 2013

какая версия базы данных H2?согласно документации, вы можете установить совместимый режим с помощью оператора SQL (http://www.h2database.com/html/features.html#compatibility)

SET MODE PostgreSQL

, просто добавьте этот оператор в ваш первый файл сценария sql, загруженный встроенной базой данных Spring jdbc

13 голосов
/ 07 февраля 2012

Согласно H2 doc , режим совместимости с Oracle весьма ограничен.

Например, вы не можете использовать процедуры PL / SQL.

Если вы используетеSpring EmbeddedDatabase, вы не можете установить режим совместимости как есть;Вы должны реализовать свой собственный EmbeddedDatabaseConfigurer и указать режим совместимости через URL JDBC (см. ниже).

Но также, чтобы использовать режим совместимости с H2 и Spring, вам просто нужно установить режим в URL-адресе JDBC (чтобы он не был связан с Spring) классическим способом, используя DataSource:

jdbc:h2:~/test;MODE=Oracle

И если вы используете Hibernate, вы должны указать диалект Oracle вместо H2.

4 голосов
/ 09 февраля 2017

У вас есть 2 варианта:

  1. используйте spring для запуска базы данных H2 следующим образом (проверьте setName (), чтобы увидеть, как передать параметры URL, специфичные для H2, в построитель пружин):

Spring-код генерирует URL следующим образом:

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

Итак, в setName() Вы можете использовать любой параметр, относящийся к H2, в URL.

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 = 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) выполняет сценарии, определенные в INIT, для каждого создания соединения с базой данных, а не один раз для создания БД!Это вызывает различные проблемы, такие как сбой INSERT из-за дублирования ключей и т.д ..

...