Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Подключение базы и Dev Services

Пока посты хранятся в памяти и пропадают при каждом перезапуске. Пора подключить базу данных. Для этого нужны два расширения: Hibernate ORM с Panache — работа с таблицами через Java-классы — и JDBC-драйвер конкретной базы. Обычно в Quarkus сначала думают не об адресе базы и пароле, а о том, нужна ли вообще настройка: в режиме разработки базу поднимает Dev Services.

Подключение расширений

./mvnw quarkus:add-extension -Dextensions="hibernate-orm-panache,jdbc-h2"

В pom.xml появятся quarkus-hibernate-orm-panache и quarkus-jdbc-h2. H2 — небольшая база данных, написанная на Java. Она работает прямо внутри приложения и ничего не требует устанавливать, поэтому удобна для учёбы. Для настоящего сервера чаще берут PostgreSQL — расширение jdbc-postgresql.

Что такое Dev Services

Dev Services — функция Quarkus, которая в режимах dev и test сама запускает нужные сервисы: базу данных, брокер сообщений, Redis. Условие одно: адрес сервиса не указан в настройках. Quarkus видит драйвер в зависимостях, видит, что quarkus.datasource.jdbc.url не задан, и поднимает базу сам.

Как именно поднимает, зависит от базы:

БазаКак запускает Dev ServicesНужен Docker
H2, DerbyВнутри приложенияНет
PostgreSQL, MySQL, MariaDB и др.В контейнере через TestcontainersДа (или Podman)

Мы используем H2, поэтому Docker не нужен. Если Docker у вас установлен, можно взять jdbc-postgresql: тогда Dev Services скачает образ PostgreSQL и запустит его в контейнере — код уроков останется тем же.

Запуск

Файл application.properties про базу ничего не говорит. Когда в проекте появится первая сущность (её мы создадим в следующем уроке), ./mvnw quarkus:dev напечатает при старте (вывод сокращён):

INFO  [io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevServicesProcessor] Setting [quarkus.hibernate-orm.schema-management.strategy]=drop-and-create to initialize Dev Services managed database
ERROR [org.testcontainers.dockerclient.DockerClientProviderStrategy] Could not find a valid Docker environment. Please check configuration.
INFO  [io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor] Dev Services for default datasource (h2) started
INFO  [io.quarkus] Installed features: [agroal, cdi, compose, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-h2, narayana-jta, rest, rest-jackson, ...]

Строка Dev Services for default datasource (h2) started значит, что база запущена. Строка ERROR про Docker появляется на компьютере без Docker: Quarkus проверяет, есть ли он, но для H2 он не нужен, и приложение работает дальше.

Схема таблиц

Первая строка лога говорит о drop-and-create: при каждом старте Hibernate удаляет таблицы и создаёт их заново по Java-классам. Для разработки это удобно — схема всегда совпадает с кодом. Но данные при перезапуске пропадают, поэтому в следующем уроке мы будем заполнять базу при старте.

Значение schema-management.strategyЧто делает
drop-and-createПересоздаёт таблицы при старте
updateДобавляет новые таблицы и столбцы, данные сохраняет
validateТолько проверяет, что схема совпадает
noneНичего не делает

База для сервера

В профиле prod Dev Services не работает, поэтому адрес нужно указать явно. Для учебного проекта возьмём H2 в файле:

# src/main/resources/application.properties
%prod.quarkus.datasource.jdbc.url=jdbc:h2:file:./data/blog
%prod.quarkus.hibernate-orm.schema-management.strategy=update

База будет храниться в файле data/blog.mv.db рядом с местом запуска. Для PostgreSQL на сервере настройки выглядят так, а пароль передают переменной окружения QUARKUS_DATASOURCE_PASSWORD:

# src/main/resources/application.properties
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/blog
%prod.quarkus.datasource.username=blog
%prod.quarkus.datasource.password=changeme

Частая ошибка

Если запустить собранное приложение без адреса базы, оно не стартует:

Unable to find datasource '<default>' for persistence unit '<default>': Bean is not active
Reason: Datasource '<default>' was deactivated automatically because its URL is not set.
To activate the datasource, set configuration property 'quarkus.datasource.jdbc.url'.

В dev всё работало благодаря Dev Services, а в prod их нет. Задайте %prod.quarkus.datasource.jdbc.url в файле или переменную окружения QUARKUS_DATASOURCE_JDBC_URL.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.