LINUX.ORG.RU

Обновление схемы-структуры БД

 , ,


1

2

Всем доброго времени суток.

Продолжаю погружаться в Java, активно разрабатываю свои небольшие сервлеты. Возник вопрос по обновлениям БД.

Чего хочется: при «заливке» нового .war на сервер получить автоматическое обновление структуры БД в соответствии с изменнеиями в репозитории с исходниками.

Что уже нашел: liquibase.

Чего не хватает: автоматизировать процесс. Т.е. хочется каким-то образом включать liquibase-файлы в war (с этим проблем, в принципе, нет), при этом чтобы tomcat при деплое нового war вызывал liquibase для обновления БД.

Жду толковых советов либо по реализации выбранной мной схемы, либо годных схем автообновления структуры БД в соответствии с установленным war.

Из того, что менять совсем не хочется:
Сервер приложений tomcat7, он же играет роль веб-сервера (это ведь нормально? или для продакшена(tm) надо искать другое решение?)
База данных: postgresql.

★★★★★

Hibernate и политика создания БД create-drop.

Для разработки самое то.

P.S. для продакшена лучше поискать что-нибудь, что поддерживает стек JavaEE, т.к. многое оттуда может понадобиться, если нужна автоматизация.

Adonai ★★★
()
Ответ на: комментарий от Adonai

Как я понял liquibase полностью готов для продакшена, но надо вручную вызывать обновление БД, что совсем не по феншую. Хочется автоматизации.

На Hibernate посмотрю, уже встречал это слово рядом со словами java, tomcat, servlet ))

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Вот грохнет тебе твоя автообновлялка какой-нибудь столбец без бэкапа, будешь потом корячиться с восстановлением. На продакшн базе изменения накатываются только руками, имхо.

А вообще в liquibase вроде были интерфейсы для запуска скриптов, давно уже делал, но всё автоматизировалось. В чём проблема, уточни.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В чём проблема, уточни.

Хочется годной хаутушки как это организовать. Сейчас для меня все выглядит так:

1. Я загружаю по ssh war-файл на сервер.
2. Tomcat его распаковывает
3. PROFIT. (веб-приложение обновилось).

Я хочу, чтобы все выглядело так:
1. Я загружаю по ssh war-файл на сервер.
2. Tomcat его распаковывает
3. Tomcat обновляет базу
4. PROFIT. (веб-приложение и БД обновились).

Может быть можно просто хук какой поставить в томкате и вызывать после этого мой самописный скрипт? Совсем не продакшен, но как временное решение на период моего обучения - должно прокатить.

P.S.

Вот грохнет тебе твоя автообновлялка какой-нибудь столбец без бэкапа

Так для этого как раз и нужны нормальные бекапы + тестирование обновлений.

trex6 ★★★★★
() автор топика

Делал такое с помощью flyway. Он попроще liquidbase и без XML.

В спринге создаёшь компонент с обновлением схемы при инициализации (через API flyway), потом объявляешь базовый компонент для persistence от него зависящим. В моём случае это было так:

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        depends-on="dbMigrationManager">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="mycoolapp"/>
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="showSql" value="false"/>
        <property name="generateDdl" value="false"/>
        <property name="databasePlatform" value="${db.dialect}"/>
      </bean>
    </property>
  </bean>
В итоге перед поднятием persistence-машинерии обновляется схема. Если обновление провалилось, то приложение не стартует и всё откатывается - спасибо transactional DDL от постгреса.

anonymous
()
Ответ на: комментарий от anonymous

Объявление самого компонента для обновления схемы: [code:XML] <bean id=«dbMigrationManager» class=«com.atcsibir.cpgu.configuration.DbMigrationManager» init-method=«manageMigrations»> <property name=«migrateOnStart» value=«${modules.migration.migrateOnStart}»/> <property name=«failOnOutdatedSchemaVersion» value=«${modules.migration.failOnOutdatedSchemaVersion}»/> <property name=«flyway»> <bean class=«com.googlecode.flyway.core.Flyway»> <property name=«dataSource» ref=«dataSource»/> <property name=«encoding» value=«Cp1251»/> </bean> </property> </bean> Компонент самописный, там логики с гулькин нос - просто дёргает при инициализации flyway нужным образом. Это чтоб идея была понятней.

Такое же можно и без спринга провернуть, главное найти место, чтобы вклиниться в инициализацию приложения.

anonymous
()
Ответ на: комментарий от anonymous

главное найти место, чтобы вклиниться в инициализацию приложения

Вот с этим у меня как раз проблемы. Только я планировал не «вклиниваться в инициализацию» своим кодом, а взять что-то готовое из состава tomcat для вклинивания на этапе деплоя/распаковки.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

В liquibase есть сервлет, пропишите его в web.xml и расставьте порядок запуска сервлетам.

ya-betmen ★★★★★
()
Ответ на: комментарий от trex6

что-то готовое из состава tomcat для вклинивания на этапе деплоя/распаковки

Не думаю, что томкат такое умеет из коробки.

Почему вообще он должен такое уметь?

Томкат «играет» веб-приложения и предоставляет им некоторые общие сервисы. А что приложению нужно для инициализации - не забота контейнера. У приложений и так для этого есть ручки, вроде servlet event listeners.

Не знаю ни одного контейнера приложений, который бы обновление схемы БД брал на себя.

anonymous
()
Ответ на: комментарий от anonymous

Вы не совсем верно меня поняли. Возможно servlet event listeners это как раз то, что мне нужно (сейчас пойду о нем почитаю). На данный момент я даже незнаю, куда можно было бы воткунть свой код с инициализацией БД. Только если в инициализацию какого-нибудь сервлета, но это не кажется мне верной дорогой.

А где это правильнее всего будет сделать?

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Где угодно, лишь бы до старта хибернейта.

Выше писали про liquidbase сервлет - тоже вариант.

Я лично на ликвидбейзовские файлы миграции после flyway без слёз смотреть не могу. Если не планируется менять БД, то plain SQL - наше всё.

anonymous
()
Ответ на: комментарий от trex6

Для поиграца можно пошалить с перестройкой структуры БД при заливки деплоя, но, как тебе уже сказали, для продакшен это не приемлемо. В один прекрасный момент не взлетит твоя база, и будет тебе грубый секс.

Томкат+хебернат не очень для твоих игрушек. Поковыряйся с чем-то более серьезным. Джибосом аль с гласфиш... спринг...

vada ★★★★★
()
Ответ на: комментарий от vada

не взлетит твоя база, и будет тебе грубый секс

Автоматический бекап при деплое спасет отца русской демократии?

А если серьезно, то хотя бы в двух словах опишите, что я найду в джибоссе с гласфиш и спринге? На что следует обратить внимание? Там подобные вещи уже реализованы?

trex6 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.