Автосоздание схемы в H2 in-memory БД: настройка URL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Можно автоматически создать схему в H2 базе данных памяти, используя конструкцию INIT=RUNSCRIPT FROM 'init.sql' в вашем JDBC URL:

Java
Скопировать код
jdbc:h2:mem:testdb;INIT=RUNSCRIPT FROM 'init.sql'

Убедитесь, что файл init.sql содержит команду CREATE SCHEMA и определения необходимых таблиц:

SQL
Скопировать код
CREATE SCHEMA IF NOT EXISTS required_schema;
CREATE TABLE required_schema.someTable (...);

Поместите init.sql в classpath вашего приложения, чтобы инициализировать таблицы и схему при каждом подключении к testdb.

Кинга Идем в IT: пошаговый план для смены профессии

Продвинутая инициализация

Выполнение нескольких команд SQL

Для объединения нескольких SQL-команд в INIT используйте экранированные точки с запятой:

Java
Скопировать код
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'init.sql'\\;SET SCHEMA quick_schema

Помните, что в Java для продолжения строки требуется двойной обратный слэш.

Если база данных остаётся открытой

Чтобы ваша база данных не закрывалась после окончания соединения, добавьте DB_CLOSE_DELAY=-1:

Java
Скопировать код
jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'init.sql'

Симуляция Oracle в H2 базе данных

При использовании MODE=Oracle база данных H2 становится более совместимой с Oracle:

Java
Скопировать код
jdbc:h2:mem:testdb;MODE=Oracle;INIT=RUNSCRIPT FROM 'init.sql'

Помните, что это может вызвать незначительные изменения в поведении вашей базы данных.

Подключение без использования Spring

Если вы не работаете в среде Spring, используйте DriverManager.getConnection для установки соединения:

Java
Скопировать код
Connection conn = DriverManager.getConnection("jdbc:h2:mem:testdb;INIT=RUNSCRIPT FROM 'classpath:init.sql");

Проверьте, что init.sql расположен в соответствующем каталоге ресурсов.

Конфигурация H2

Выбор имени для внутрипамятной базы данных

Для предотвращения конфликта имен используйте уникальные имена внутрипамятных баз данных:

Java
Скопировать код
jdbc:h2:mem:unique_testdb;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'init.sql'

Работа в Spring с несколькими схемами

В Spring-приложениях для инициализации нескольких схем используйте EmbeddedDatabaseBuilder:

Java
Скопировать код
new EmbeddedDatabaseBuilder()
  .setType(EmbeddedDatabaseType.H2)
  .addScript("schema-init.sql")
  .build();

Автоматическое создание схемы в приложении на Spring

В application.yml настройте URL источника данных таким образом, чтобы автоинициализация схемы происходила при запуске приложения:

yaml
Скопировать код
spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'

Обработка и предотвращение ошибок

Ошибки при указании пути

Всегда проверяйте правильность пути SQL-скриптов! Префикс 'classpath:' означает, что скрипт должен находиться в каталоге ресурсов.

Осторожно с сменой схемы

Если после команды CREATE SCHEMA не использовать SET SCHEMA, вы можете случайно создать объекты в другой схеме.

Случайные потери данных

Без использования DB_CLOSE_DELAY=-1 ваша база данных может закрыться самопроизвольно, из-за чего данные могут пропасть между сессиями.

Адекватное управление ресурсами

При работе с ресурсами используйте менеджмент ресурсов с помощью конструкций try-with-resources или try-catch:

Java
Скопировать код
try (Connection conn = DriverManager.getConnection(...)) {
    // Работаем со соединением
} catch (SQLException e) {
    // Обрабатываем исключения
}

Визуализация

Автоматическое создание схемы во внутрипамятной базе данных H2 можно сравнить с появлением мебели по вашему желанию:

Markdown
Скопировать код
Вы – волшебник (🧙) в пустой комнате (🪑🛋️🛏️):

Без схемы:
🧙➡️ [ Нет стульев, нет диванов, нет кроватей ]

С автосозданием:
🧙➡️ [🪑 Стул, 🛋️ Диван, 🛏️ Кровать ]

Абракадабра! И мебель появляется, как по магии!

В этом контексте, создание мебели – это как автосоздание схемы.

Markdown
Скопировать код
CREATE SCHEMA IF NOT EXISTS
              ↑
    Это как "Accio Chair!", если стул ранее не был вызван.

Подсказки по работе с JDBC URL

Используйте эти трюки и уловки для эффективной настройки JDBC URL для внутрипамятной базы данных H2:

Java
Скопировать код
String url = "jdbc:h2:mem:testdb;" +
             "DB_CLOSE_DELAY=-1;" +
             "INIT=RUNSCRIPT FROM 'init.sql'\\;" +
             "SET SCHEMA quick_schema";
Connection conn = DriverManager.getConnection(url);

Полезные материалы

  1. H2 Database Engine — собрание справочных материалов по часто используемым командам H2 Database.
  2. Работа с тегом 'h2+schema' на Stack Overflow — активные дискуссии и решения, связанные с схемами базы данных H2 на Stack Overflow.
  3. Быстрый старт с H2 Database — пошаговое руководство по созданию новых баз данных в H2, включая базы данных в оперативной памяти.
  4. SQL Грамматика – Документация H2 — руководство по грамматике SQL, которую поддерживает H2.
  5. Основные возможности – H2 Database — обзор возможностей баз данных в оперативной памяти H2, включая создание схем.
  6. Введение в JPA | Доступ к данным — практическое руководство по использованию Spring Boot с демонстрацией создания схем при доступе к данным.
  7. Использование консоли H2 Database в Spring Boot с Spring Security – DZone — руководство по настройке консоли H2 Database в Spring Boot, что важно для управления схемами.