Гибернация: hbm2ddl.auto = обновление в производстве?

Можно ли запускать приложения Hibernate, настроенные 9X_oraclejdk с помощью hbm2ddl.auto=update, для обновления схемы базы данных 9X_java-libraries в производственной среде?

371
2

  • Мы делаем это. Ни разу не было проблем.<p><span cla ...
15
Общее количество ответов: 15

Ответ #1

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Нет, это небезопасно.

Несмотря на все усилия 9X_javax команды Hibernate, вы просто не можете полагаться 9X_javax на автоматические обновления в производственной среде. Напишите 9X_.java свои собственные исправления, просмотрите 9X_hibernate их с администратором баз данных, протестируйте 9X_hibernate и примените вручную.

Теоретически, если hbm2ddl update работало 9X_.java в процессе разработки, оно должно работать 9X_java и в производственной среде. Но на самом 9X_oraclejdk деле так бывает не всегда.

Даже если это 9X_hbm2ddl сработало, оно может быть неоптимальным. Администраторам 9X_hbm2ddl баз данных не зря платят так много.

421
8

  • и давайте не будем забывать .. никто не любит быть парнем `rm -rf /` :) .. или в этом случае парнем, который несе ...

Ответ #2

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Мы делаем это в производственной среде, хотя 9X_java-libraries и с приложением, которое не является критически 9X_core-java важным, и без высокооплачиваемых администраторов 9X_java-api баз данных в штате. Это всего лишь на один 9X_java ручной процесс меньше, подверженный человеческой 9X_jdk ошибке - приложение может обнаружить разницу 9X_.java и поступить правильно, к тому же вы, вероятно, протестировали 9X_java его в различных средах разработки и тестирования.

Одно 9X_hibernate предостережение - в кластерной среде вы 9X_javax можете захотеть этого избежать, потому что 9X_java-se несколько приложений могут запускаться одновременно 9X_java-libraries и пытаться изменить схему, что может быть 9X_hbm2ddl плохим. Или добавьте какой-то механизм, в 9X_oraclejdk котором только одному экземпляру разрешено 9X_jre обновлять схему.

72
1

  • Мы также используем его в производстве, аналогичный вариант использования. Платформа аналитики, которая не критична. Мы развернули 16 тыс. Раз в 4 средах (за 4 года) без особых проблем с гибернацией. Мы небольшая ...

Ответ #3

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Создатели Hibernate не рекомендуют делать 9X_core-java это в производственной среде в своей книге 9X_java "Java Persistence with Hibernate":

ВНИМАНИЕ! Мы видели, как пользователи Hibernate 9X_javax пытались использовать SchemaUpdate для автоматического 9X_oraclejdk обновления схемы производственной базы данных. Это 9X_j2se может быстро закончиться катастрофой и не 9X_hbm2ddl будет разрешено вашим администратором баз 9X_oraclejdk данных.

58
1

  • Это было написано в ...

Ответ #4

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Ознакомьтесь с LiquiBase XML, чтобы вести 9X_core-java журнал изменений. Я никогда не использовал 9X_java-se его до этого года, но обнаружил, что его 9X_core-java очень легко изучить и сделать очень надежным 9X_jre управление версиями БД / миграцию / управление 9X_hibernate изменениями. Я работаю над проектом Groovy 9X_oraclejdk / Grails, и Grails использует Hibernate 9X_jdk для всех своих ORM (называемых «GORM»). Мы 9X_oraclejdk используем Liquibase для управления всеми 9X_core-java изменениями схемы SQL, что мы делаем довольно 9X_hbm2ddl часто по мере развития нашего приложения 9X_jre с новыми функциями.

По сути, вы храните XML-файл 9X_jdk наборов изменений, который продолжаете добавлять 9X_java-api по мере развития вашего приложения. Этот 9X_java-libraries файл хранится в git (или в другом месте, которое 9X_jdk вы используете) вместе с остальной частью 9X_jre вашего проекта. Когда ваше приложение развернуто, Liquibase 9X_java-libraries проверяет его таблицу журнала изменений 9X_.java в БД, к которой вы подключаетесь, чтобы 9X_java знать, что уже было применено, а затем разумно 9X_java-api просто применяет те изменения, которые еще 9X_hibernate не были применены из файла. На практике 9X_hbm2ddl он отлично работает, и если вы используете 9X_core-java его для всех изменений схемы, то можете 9X_oraclejdk быть на 100% уверены, что код, который вы 9X_core-java проверяете и развертываете, всегда сможет 9X_java-libraries подключиться к полностью совместимой схеме 9X_j2se базы данных.

Замечательно то, что я могу 9X_hibernate взять на свой ноутбук полностью чистую базу 9X_java-se данных mysql, запустить приложение и сразу 9X_hibernate же настроить схему. Это также упрощает тестирование 9X_.java изменений схемы, сначала применяя их к local-dev 9X_jdk или промежуточной базе данных.

Самый простой 9X_hbm2ddl способ начать с ним - это, вероятно, взять 9X_java-libraries существующую БД, а затем использовать Liquibase 9X_hbm2ddl для создания исходного файла baseline.xml. Затем 9X_hbm2ddl в будущем вы можете просто добавить его, и 9X_java-libraries позволить Liquibase взять на себя управление 9X_oraclejdk изменениями схемы.

http://www.liquibase.org/

31
0

Ответ #5

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Hibernate должен заявить об отказе от использования 9X_j2se автоматических обновлений в продукте, чтобы 9X_java-libraries прикрыть себя, когда люди, которые не знают, что 9X_java-se они делают, используют его в ситуациях, когда 9X_java-se его использовать не следует.

Допущено, что 9X_jdk ситуаций, в которых его не следует использовать, намного 9X_core-java больше, чем тех, в которых это нормально.

Я 9X_core-java использовал его в течение многих лет во 9X_jdk множестве разных проектов и никогда не сталкивался 9X_javax ни с одной проблемой. Это не хромой ответ 9X_java-se и не ковбойское программирование. Это исторический 9X_java факт.

Человек, который говорит, что «никогда 9X_java-api не делайте этого в производственной среде», думает 9X_core-java о конкретном наборе производственных развертываний, а 9X_oraclejdk именно о тех, с которыми он знаком (его 9X_jdk компания, его отрасль и т. д.).

Мир "производственных 9X_java-se развертываний" огромен и разнообразен.

Опытный 9X_hibernate разработчик Hibernate точно знает, что DDL 9X_j2se будет результатом данной конфигурации сопоставления. Пока 9X_javax вы проверяете и подтверждаете, что ожидаемые 9X_javax результаты попадают в DDL (в dev, qa, staging 9X_java-api и т. Д.), Все в порядке.

Когда вы добавляете 9X_java-libraries множество функций, автоматическое обновление 9X_jdk схемы может сэкономить время в реальном 9X_hbm2ddl времени.

Список вещей, которые не обрабатываются 9X_java-api при автоматическом обновлении, бесконечен, но 9X_.java некоторые примеры - это миграция данных, добавление 9X_openjdk столбцов, не допускающих значения NULL, изменение 9X_hbm2ddl имени столбца и т. д.

Также вам нужно позаботиться 9X_hibernate о кластерных средах.

Но опять же, если бы 9X_java-api вы все это знали, вы бы не задавали этот 9X_javax вопрос. Хм . . . Хорошо, если вы задаете 9X_openjdk этот вопрос, вам следует подождать, пока 9X_java-se у вас не появится большой опыт работы с 9X_hibernate Hibernate и автоматическими обновлениями 9X_hbm2ddl схемы, прежде чем вы подумаете об использовании 9X_java-libraries его в продукте.

31
0

Ответ #6

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Не рекомендуется использовать hbm2ddl.auto в рабочей 9X_core-java среде.

Единственный способ управлять схемой 9X_hibernate базы данных - использовать сценарии инкрементной 9X_jre миграции, потому что:

  • скрипты будут находиться в VCS вместе с вашей кодовой базой. Когда вы проверяете ветку, вы воссоздаете всю схему с нуля.
  • инкрементные скрипты можно протестировать на сервере контроля качества перед применением в производственной среде.
  • ручное вмешательство не требуется, поскольку сценарии можно запускать с помощью Flyway, что снижает вероятность человеческой ошибки, связанной с запуском сценариев вручную.

Даже Hibernate User Guide советуют избегать 9X_jre использования инструмента hbm2ddl для производственных 9X_hbm2ddl сред.

9X_Гибернация: hbm2ddl.auto = обновление в производстве?_javax

30
2

  • Используйте `SchemaExport`, как показано в этом [тестовом примере] (https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/ja ...

Ответ #7

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Я бы проголосовал против. Hibernate, похоже, не 9X_jre понимает, когда типы данных для столбцов 9X_.java изменились. Примеры (с использованием MySQL):

String with @Column(length=50)  ==> varchar(50)
changed to
String with @Column(length=100) ==> still varchar(50), not changed to varchar(100)

@Temporal(TemporalType.TIMESTAMP,TIME,DATE) will not update the DB columns if changed

Вероятно, есть 9X_jdk и другие примеры, например, увеличение длины 9X_jre столбца String выше 255 и его преобразование 9X_java в текст, средний текст и т. д.

Конечно, я 9X_java не думаю, что существует действительно способ 9X_hbm2ddl «преобразовать типы данных» без создания 9X_oraclejdk нового столбца, копирования данных и удаления 9X_jdk старого столбца. Но как только в вашей базе 9X_.java данных появятся столбцы, которые не отражают 9X_jre текущее отображение Hibernate, вы очень 9X_jdk опасно живете ...

Пролетный путь - хороший 9X_openjdk вариант решения этой проблемы:

http://flywaydb.org

27
2

  • Я только что попробовал первую часть вашего примера - в моем случае изменил `@Column (length = 45)` н ...

Ответ #8

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Я бы не стал рисковать, потому что вы можете 9X_jre потерять данные, которые должны были быть 9X_j2se сохранены. hbm2ddl.auto = update - простой 9X_hbm2ddl способ поддерживать вашу базу данных в актуальном 9X_.java состоянии.

9
2

  • Да, конечно, но восстановление из резервной копии - это большая работа. ...

Ответ #9

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Мы делаем это в проекте, который работает 9X_oraclejdk в производственной среде уже несколько месяцев, и 9X_hibernate пока у нас никогда не было проблем. Помните 9X_java о 2 ингредиентах, необходимых для этого 9X_jre рецепта:

  1. Разрабатывайте свою объектную модель 9X_oraclejdk с учетом подхода обратной совместимости, то 9X_hbm2ddl есть не рекомендуется объекты и атрибуты, а не удалять / изменять 9X_openjdk их. Это означает, что если вам нужно изменить 9X_j2se имя объекта или атрибута, оставьте старое 9X_openjdk как есть, добавьте новое и напишите какой-нибудь 9X_oraclejdk скрипт миграции. Если вам нужно изменить 9X_jre связь между объектами, если вы уже находитесь 9X_core-java в производстве, это означает, что ваш дизайн 9X_java-se изначально был неправильным, поэтому попробуйте 9X_.java придумать новый способ выражения новых отношений, не 9X_java-libraries затрагивая старые данные.

  2. Всегда резервное копирование базы данных 9X_.java перед развертыванием.

После прочтения этой 9X_core-java статьи я понял, что 90% людей, участвующих 9X_java-se в этом обсуждении, приходят в ужас при одной 9X_java-api мысли об использовании подобных средств 9X_core-java автоматизации в производственной среде. Некоторые 9X_java-libraries бросают мяч в DBA. Однако подумайте, что не во всех 9X_core-java производственных средах есть администратор 9X_java баз данных, и не многие команды разработчиков 9X_jre могут себе его позволить (по крайней мере, для 9X_java-libraries проектов среднего размера). Итак, если мы 9X_openjdk говорим о командах, где все должны делать 9X_java-api все, то мяч за ними.

В таком случае, почему 9X_hbm2ddl бы просто не попытаться получить лучшее 9X_hibernate из обоих миров? Подобные инструменты здесь, чтобы 9X_java-api протянуть руку помощи, которые - при тщательном 9X_java-se проектировании и планировании - могут помочь 9X_java-libraries во многих ситуациях. И поверьте мне, администраторов 9X_.java поначалу может быть трудно убедить, но если 9X_jre они знают, что мяч не в их руках, им это 9X_java-api понравится.

Лично я никогда не вернусь к 9X_javax написанию вручную скриптов для расширения 9X_core-java любого типа схемы, но это только мое мнение. И 9X_hibernate после того, как я недавно начал внедрять 9X_java-se базы данных без схемы NoSQL, я вижу, что 9X_oraclejdk более чем скоро все эти операции на основе 9X_j2se схем уйдут в прошлое, так что вам лучше 9X_javax начать менять свою точку зрения и смотреть 9X_java-se в будущее.

8
1

  • Я не согласен с комментарием NoSQL. Он определенно находится на подъеме и имеет свое место, но есть много приложений, которые полностью зависят от соответствия ACID для целостности данных с параллелизмом и транзакциями, которы ...

Ответ #10

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

  • В моем случае (Hibernate 3.5.2, Postgresql, Ubuntu) установка 9X_javax hibernate.hbm2ddl.auto=update только создавала новые таблицы и создавала 9X_.java новые столбцы в уже существующих таблицах.

  • При 9X_jre этом не удалялись ни таблицы, ни столбцы, ни 9X_jre изменения столбцов. Это можно назвать безопасным 9X_java-libraries вариантом, но что-то вроде hibernate.hbm2ddl.auto=create_tables add_columns было бы более 9X_.java понятным.

6
0

Ответ #11

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Это небезопасно, не рекомендуется, но возможно.

У 9X_java-libraries меня есть опыт работы с приложением, использующим 9X_java-se функцию автоматического обновления в производственной 9X_java-api среде.

Итак, основные проблемы и риски, обнаруженные 9X_java-se в этом решении:

  • Развернуть не в той базе данных. Если вы совершите ошибку при запуске сервера приложений со старой версией приложения (EAR / WAR / и т. Д.) В неправильной базе данных ... У вас будет много новых столбцов, таблиц, внешних ключей и ошибок. Та же проблема может возникнуть из-за простой ошибки в файле источника данных (скопировать / вставить файл и забыть изменить базу данных). В общем, ситуация может обернуться катастрофой для вашей базы данных.
  • Сервер приложений запускается слишком долго. Это происходит из-за того, что Hibernate пытается найти все созданные таблицы / столбцы / и т. Д. Каждый раз, когда вы запускаете приложение. Ему нужно знать, что (таблицу, столбец и т. Д.) Нужно создать. Эта проблема будет только усугубляться по мере роста таблиц базы данных.
  • Инструменты базы данных использовать практически невозможно. Чтобы создать сценарии DDL или DML базы данных для запуска с новой версией, вам нужно подумать о том, что будет создано при автоматическом обновлении после запуска сервера приложений. Например, если вам нужно заполнить новый столбец некоторыми данными, вам нужно запустить сервер приложений, дождаться, пока Hibernate создаст новый столбец, и только после этого запустить сценарий SQL. Как видите, инструменты миграции баз данных (такие как Flyway, Liquibase и т. Д.) Практически невозможно использовать с включенным автоматическим обновлением.
  • Изменения в базе данных не централизованы. С возможностью создания таблиц Hibernate и всего остального, трудно отслеживать изменения в базе данных в каждой версии приложения, потому что большинство из них вносятся автоматически.
  • Поощряет удаление мусора в базе данных. Из-за «простого» использования автообновления есть вероятность, что ваша команда не удалит старые столбцы и старые таблицы, потому что автоматическое обновление гибернации не может этого сделать.
  • Неминуемая катастрофа. Неминуемый риск возникновения какой-либо катастрофы в производстве (как некоторые люди, упомянутые в других ответах). Даже если приложение работает и обновляется годами, я не думаю, что это безопасный выбор. Я никогда не чувствовал себя в безопасности, используя этот вариант.

Поэтому я не рекомендую использовать 9X_javax автообновление в продакшене.

Если вы действительно 9X_java-api хотите использовать автоматическое обновление 9X_javax в производственной среде, я рекомендую:

  • Разделенные сети. Ваша тестовая среда не может получить доступ к среде гомолога. Это помогает предотвратить развертывание, которое должно было происходить в тестовой среде, с изменением базы данных Homologation.
  • Управление порядком скриптов. Вам необходимо организовать свои сценарии для запуска перед развертыванием (изменение таблицы структуры, удаление таблицы / столбцов) и сценария после развертывания (заполнение информации для новых столбцов / таблиц).

И, в 9X_.java отличие от других сообщений, я не думаю, что 9X_hibernate автоматическое обновление связано с "очень 9X_java-api хорошо оплачиваемыми" администраторами баз 9X_jre данных (как упоминалось в других сообщениях). У 9X_core-java администраторов баз данных есть более важные 9X_jre дела, чем писать операторы SQL для создания 9X_hibernate / изменения / удаления таблиц и столбцов. Эти 9X_.java простые повседневные задачи могут быть выполнены 9X_hibernate и автоматизированы разработчиками и переданы 9X_core-java на рассмотрение только команде администраторов 9X_java-api баз данных, и для их написания не требуется 9X_hbm2ddl «очень хорошо оплачиваемый» Hibernate и 9X_openjdk администраторы баз данных.

6
0

Ответ #12

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Нет, никогда этого не делайте. Hibernate 9X_jre не обрабатывает перенос данных. Да, при 9X_jre этом ваша схема будет выглядеть правильно, но 9X_java-libraries это не гарантирует, что ценные производственные 9X_hbm2ddl данные не будут потеряны в процессе.

5
0

Ответ #13

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

  • Обычно корпоративные приложения в крупных 9X_core-java организациях запускаются с ограниченными 9X_oraclejdk правами.

  • Имя пользователя базы данных может 9X_java-se не иметь прав DDL для добавления столбцов, которые 9X_openjdk требуются для hbm2ddl.auto=update.

4
1

  • Это не «проблема», это Правильная вещь.<p><span c ...

Ответ #14

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Я согласен с Владимиром. Администраторы 9X_jre в моей компании определенно не оценили бы, если 9X_oraclejdk бы я даже предложил такой курс.

Кроме того, создание 9X_oraclejdk сценария SQL вместо слепого доверия Hibernate 9X_.java дает вам возможность удалить поля, которые 9X_java-se больше не используются. Hibernate этого 9X_java-se не делает.

И я считаю, что сравнение производственной 9X_java-api схемы с новой схемой дает вам еще более 9X_jre полное представление о том, какие изменения 9X_hbm2ddl вы внесли в модель данных. Вы знаете, конечно, потому 9X_.java что вы это сделали, но теперь вы видите 9X_jdk все изменения сразу. Даже те, которые заставляют 9X_java-api вас воскликнуть: «Какого черта ?!»

Существуют 9X_java-api инструменты, которые могут сделать за вас 9X_java-libraries дельту схемы, так что это даже не сложно. И 9X_j2se тогда вы точно знаете, что произойдет.

2
0

Ответ #15

Ответ на вопрос: Гибернация: hbm2ddl.auto = обновление в производстве?

Схема приложений может со временем развиваться; если 9X_core-java у вас несколько установок, которые могут 9X_hibernate быть разных версий, у вас должен быть способ 9X_jre гарантировать, что ваше приложение, какой-либо 9X_java-libraries инструмент или скрипт может поэтапно переносить 9X_core-java схему и данные из одной версии в любую из 9X_java следующих.

Сохранение всей вашей настойчивости 9X_j2se в отображениях (или аннотациях) Hibernate 9X_jre - очень хороший способ держать эволюцию 9X_java-se схемы под контролем.

Следует учитывать, что 9X_java-api при эволюции схемы необходимо учитывать 9X_core-java несколько аспектов:

  1. эволюция схемы базы данных 9X_javax в добавление дополнительных столбцов и таблиц

  2. удаление 9X_jdk старых столбцов, таблиц и отношения

  3. заполнение 9X_java новых столбцов значениями по умолчанию

Инструменты 9X_jdk гибернации особенно важны в том случае, если 9X_j2se (как по моему опыту) у вас есть разные версии 9X_openjdk одного и того же приложения во многих разных 9X_j2se типах баз данных.

Точка 3 очень важна, если 9X_oraclejdk вы используете Hibernate, например, если 9X_openjdk вы вводите новое свойство с логическим или 9X_java числовым значением, если Hibernate найдет 9X_java-libraries любое нулевое значение в таких столбцах, если 9X_j2se вызовет исключение.

Итак, что я бы сделал: действительно 9X_jdk использовать возможности инструментов Hibernate 9X_java для обновления схемы, но вы должны добавить 9X_j2se наряду с этим некоторые данные и обратный 9X_jdk вызов обслуживания схемы, например, для 9X_java-se заполнения значений по умолчанию, удаления 9X_oraclejdk больше не используемых столбцов и т. д. Таким 9X_oraclejdk образом, вы получаете преимущества (сценарии 9X_j2se обновления схемы, независимые от базы данных 9X_hibernate и избежание дублирования кодирования обновлений, в 9X_jre постоянстве и в сценариях), но вы также 9X_oraclejdk охватываете все аспекты операции.

Так, например, если 9X_hibernate обновление версии заключается в простом 9X_java добавлении свойства, имеющего значение varchar 9X_jre (следовательно, столбца), которое по умолчанию 9X_oraclejdk может иметь значение null, с автоматическим 9X_java обновлением все будет выполнено. Там, где 9X_java-api требуется больше сложности, потребуется 9X_java-api дополнительная работа.

Предполагается, что 9X_javax приложение при обновлении способно обновлять 9X_j2se свою схему (это можно сделать), что также 9X_jre означает, что у него должны быть права пользователя 9X_core-java для этого в схеме. Если политика клиента 9X_java предотвращает это (вероятно, случай Lizard 9X_java-libraries Brain), вам придется предоставить скрипты, специфичные 9X_java-libraries для базы данных.

2
0