Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

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

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

Можно автоматически создать схему в 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 для продолжения строки требуется двойной обратный слэш.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

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

Чтобы ваша база данных не закрывалась после окончания соединения, добавьте 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, что важно для управления схемами.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какова структура JDBC URL для автоматического создания схемы в H2 базе данных памяти?
1 / 5