hibernate: значение hbm2ddl в рабочей среде [дубликат]

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

294
задан cherouvim 7 May 2009 в 18:42
поделиться

15 ответов

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

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

Теоретически, если hbm2ddl update работал в разработке, он также должен работать на производстве. Но на самом деле это не всегда так.

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

342
ответ дан sumitsu 19 August 2018 в 00:07
поделиться
  • 1
    Почему это небезопасно? – cretzel 21 October 2008 в 11:43
  • 2
    Это небезопасно, потому что прикладные исправления могут иметь побочные эффекты, которые вряд ли могут предсказать hbm2ddl (например, отключить триггеры, которые были установлены для изменения таблицы). Для сложных схем самый безопасный способ - ручной. Автоматический с пострегрессионным тестированием является вторым. Все ИМХО. – Vladimir Dyuzhev 21 October 2008 в 15:06
  • 3
    Также обновление db-схемы должно выполняться профессионалами (dbas). В лучшем случае восстановление из-за плохого изменения дБ затруднено. Вова не упоминал об этом, но что произойдет, если обновление спящего режима решит удалить столбец и повторно добавить его, потому что тип или размер изменились. И скажем, что столбец - это все ваши адреса электронной почты ваших пользователей? :-) bye, bye company ..... Вы хотите, чтобы изменения DDL генерировались автоматически, но вы абсолютно хотите, чтобы изменения были проверены человеком. – Pat 18 May 2010 в 19:19
  • 4
    Не делаете ли вы резервное копирование своих баз данных до обновления? – Jacob 2 September 2010 в 12:10
  • 5
    Fwiw, в настоящий момент обновление схемы Hibernate не отменяет таблицы или столбцы. – Brian Deterling 29 November 2010 в 20:04
  • Обычно корпоративные приложения в крупных организациях работают со сниженными привилегиями.
  • Имя пользователя базы данных может не иметь привилегии DDL для добавления столбцов, которые требуется hbm2ddl.auto=update.
3
ответ дан Aniket Kulkarni 19 August 2018 в 00:07
поделиться
  • 1
    это проблема, с которой я часто сталкиваюсь. Мы пытаемся использовать спящий режим для первоначального создания базы данных, но часто это невозможно сделать. – Dan 17 August 2010 в 15:59
  • 2
    Это не «проблема», это правая вещь. – Vladimir Dyuzhev 25 March 2011 в 17:25

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

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

Я использовал его в течение многих лет на множестве разных проектов и никогда не имел ни одной проблемы. Это не хромой ответ, и это не ковбойское кодирование. Это исторический факт.

Человек, который говорит «никогда не делайте этого в производстве», думает о конкретном наборе производственных решений, а именно о тех, с которыми он знаком (его компания, его индустрия и т. Д.).

Вселенная «производственных развертываний» обширна и разнообразна.

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

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

Список автоматических обновлений материала не будет бесконечным, но некоторые примеры - перенос данных, добавление столбцов с нулевыми значениями, изменения имени столбца и т. д. и т. д.

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

Но опять же, если бы вы знали все это, вы не стали бы задавать этот вопрос. Хм. , , Хорошо, если вы задаете этот вопрос, вам стоит подождать, пока у вас не будет много опыта с обновлением Hibernate и автоматической схемы, прежде чем вы подумаете об использовании его в prod.

18
ответ дан An̲̳̳drew 19 August 2018 в 00:07
поделиться

Я бы не голосовал. Hibernate, похоже, не понимает, когда изменились типы данных для столбцов. Примеры (с использованием 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

Есть, вероятно, и другие примеры, такие как толкание длины столбца String выше 255 и просмотр его преобразования в текст, средний текст и т. Д. И т. Д.

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

Flyway - хороший вариант для решения этой проблемы:

http://flywaydb.org

23
ответ дан Axel Fontaine 19 August 2018 в 00:07
поделиться
  • 1
    Я просто попробовал первую часть вашего примера - в моем случае сменил @Column(length = 45) на @Column(length = 255). Можно проверить, что Hibernate 4.3.6.Final правильно обновил схему базы данных с помощью hbm2ddl.auto=update. (Одна вещь, котор нужно упомянуть база данных в настоящее время не имеет никакие данные в ей - только структура.) – Steve Chambers 17 September 2014 в 10:42
  • 2
    Очень возможно, что они исправили эту ошибку где-то в течение последних 6 лет или около того. Однако, если у вас есть данные в схеме и сделано изменение, которое привело к уменьшению ширины столбца, вы столкнулись с ошибками или усечением неуправляемых данных. – cliff.meyers 20 December 2014 в 14:50
  • 3
    flywaydb нужен SQL-скрипт, созданный вручную, он должен быть лучше, чем автоматическая программа, но кто может написать большой скрипт, тогда это проблема. – Bằng Rikimaru 13 June 2017 в 17:52

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

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

65
ответ дан Brian Deterling 19 August 2018 в 00:07
поделиться

Мы делаем это в проекте, который работает в течение нескольких месяцев, и до сих пор у него не было проблемы. Помните о двух ингредиентах, необходимых для этого рецепта:

  1. Создайте свою объектную модель с помощью подхода обратной совместимости, который отвергает объекты и атрибуты, а не удаляет / изменяет их. Это означает, что если вам нужно изменить имя объекта или атрибута, оставьте старый, как есть, добавьте новый и напишите какой-то сценарий миграции. Если вам нужно изменить связь между объектами, если вы уже находитесь в производстве, это означает, что ваш дизайн был неправильным в первую очередь, поэтому попробуйте подумать о новом способе выражения новых отношений, не затрагивая старые данные.
  2. Всегда резервируйте базу данных до развертывания.

Мое чувство - после прочтения этого сообщения - что 90% людей, принимающих участие в этом обсуждении, ужасаются только мыслью об использовании таких автоматических средств в производственной среде. Некоторые бросают мяч в DBA. Подумайте, хотя подумайте, что не все производственные среды обеспечат DBA, и не многие команды разработчиков могут позволить себе один (по крайней мере, для проектов среднего размера). Итак, если мы говорим о командах, где все должны делать все, мяч на них.

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

Лично я никогда не возвращался к написанию скриптов вручную для расширения любого типа схемы, но это только мое мнение. И после того, как в последнее время я начал использовать базы данных без схемы NoSQL, я вижу, что более чем скоро все эти операции на основе схем будут принадлежать прошлому, поэтому вам лучше начать менять свою перспективу и смотреть вперед.

6
ответ дан chris 19 August 2018 в 00:07
поделиться
  • 1
    Я не согласен с комментарием NoSQL. Он определенно находится на подъеме и имеет свое место, но есть много приложений, которые абсолютно зависят от соответствия ACID для целостности данных с помощью параллелизма и транзакций, которые NoSQL просто не может предоставить. – jpswain 13 August 2011 в 20:54

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

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

Ну, основные проблемы и риски найденные в этом решении:

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

Итак, я не буду рекомендовать использовать автоматическое обновление на производстве.

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

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

И, разные из других сообщений, я не думаю, что автообновление включало его в связи с «очень хорошо оплачиваемыми» администраторами баз данных (как упоминалось в других сообщениях) ... Администраторы баз данных имеют более важные функции, чем писать инструкции SQL для создания / изменения / удалить таблицы и столбцы. Эти простые повседневные задачи могут быть сделаны и автоматизированы разработчиками и переданы только команде DBA для рассмотрения, не требуя, чтобы Hibernate и администраторы баз данных «очень хорошо оплачивали», чтобы написать их.

4
ответ дан Dherik 19 August 2018 в 00:07
поделиться

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

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

И я считаю, что сравнение производственной схемы с новой схемой дает вам еще более глубокое понимание того, как вы изменились в модели данных. Вы знаете, конечно, потому что вы это сделали, но теперь вы видите все изменения за один раз. Даже те, которые заставляют вас идти «Что за черт?!».

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

2
ответ дан extraneon 19 August 2018 в 00:07
поделиться

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

6
ответ дан Jaap Coomans 19 August 2018 в 00:07
поделиться
  • 1
    Не делаете ли вы резервное копирование своих баз данных до обновления? – Jacob 2 September 2010 в 12:09
  • 2
    Да, конечно, да, но много работы по восстановлению из резервной копии. Не стоит беспокоиться о восстановлении резервных копий, когда вы можете также обновлять свою базу данных упорядоченным образом. – Jaap Coomans 10 September 2010 в 09:57

Проверьте LiquiBase XML для хранения изменений в обновлениях. Я никогда не использовал его до этого года, но я обнаружил, что его очень легко изучить и сделать управление ревизией / миграцией / изменением управления версией DB очень надежным. Я работаю над проектом Groovy / Grails, а Grails использует Hibernate под всем своим ORM (называемым «GORM»). Мы используем Liquibase для управления всеми изменениями в схеме SQL, которые мы делаем довольно часто, поскольку наше приложение развивается с новыми функциями.

В основном вы сохраняете XML-файл изменений, который вы по-прежнему добавляете по мере развития вашего приложения. Этот файл хранится в git (или независимо от того, что вы используете) с остальной частью вашего проекта. Когда ваше приложение развернуто, Liquibase проверяет его таблицу изменений в базе данных, к которой вы подключаетесь, поэтому она будет знать, что уже было применено, тогда она разумно применяет все изменения, которые еще не были применены в файле. На практике он отлично работает на практике, и если вы используете его для всех изменений схемы, то вы можете быть на 100% увереннее, что код, который вы проверяете и развертываете, всегда сможет подключиться к полностью совместимой схеме базы данных.

Удивительно, что я могу взять полностью чистую базу данных mysql на моем ноутбуке, запустить приложение, и сразу же схема настроена для меня. Это также упрощает проверку изменений схемы, применяя их сначала к локальному dev или промежуточному db.

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

http://www.liquibase.org/

28
ответ дан jpswain 19 August 2018 в 00:07
поделиться
  • 1
    Отлично, только то, к чему я собирался перейти. Я считаю, что лучше всего сделать один шаг вперед, чтобы добавить hbm2ddl.auto=update, чтобы ваши сопоставления Class / DB были проверены, и вы полностью контролируете создание БД через Liquibase. Как вы думаете? – bholagabbar 7 March 2017 в 21:42
  • 2
    Упс, я имел в виду validate – bholagabbar 8 March 2017 в 09:59
  • 3
    Liquibase лучше управляет скриптом с использованием include-import & quot; поддержка поддержки и поддержки версий и & quot; Тип & quot; атрибут для файлов, который поможет вам иметь разные файлы SQL для разных условий, имеющих отношения родительского ребенка. в двух словах, Go традиционный SQL Mgmt. в производстве. Для развития нам нужна скорость для производства, нам нужны гарантии, стабильность и резервное копирование. – Karan Kaw 12 March 2017 в 05:49

Создатели Hibernate не рекомендуют делать это в производственной среде в своей книге «Сохранение Java с Hibernate» :

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

45
ответ дан naXa 19 August 2018 в 00:07
поделиться

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

Имея все ваше упорство в сопоставлениях спящего режима (или аннотации), это очень хороший способ контролировать эволюцию схемы.

Вы должны учитывать, что эволюция схемы имеет несколько аспектов:

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

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

Точка 3 очень чувствительна, если вы используете Hibernate, так как в случае, если вы вводите новое логическое значение или числовое значение, если Hibernate найдет любое нулевое значение в таких столбцах, если возникнет исключение.

Итак, что бы я сделал: действительно используйте возможности инструментов Hibernate для обновления схемы, но вы должны добавить вместе с ним некоторые обратные вызовы обслуживания данных и схемы, например, для заполнения значений по умолчанию, сброса более не используемых столбцов, и тому подобное. Таким образом, вы получаете преимущества (сценарии обновления базы данных, независимые от схемы, и избегаете дублирования кодирования обновлений, в реальном времени и в сценариях), но вы также охватываете все аспекты операции.

Так, например, если обновление версии состоит только в добавлении свойства varchar valued (следовательно, column), которое по умолчанию может иметь значение null, при этом автоматически будет выполнено обновление.

Предполагается, что приложение, когда оно обновлено, может обновить свою схему (это может быть сделано), что также означает, что он должен иметь права пользователя сделать это на схеме. Если политика клиента предотвращает это (вероятно, случай с ящерицей Lizard), вам придется предоставить сценарии, специфичные для базы данных.

2
ответ дан Pietro Polsinelli 19 August 2018 в 00:07
поделиться

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

5
ответ дан Robert 19 August 2018 в 00:07
поделиться

Как я объяснил в этой статье , неплохо использовать hbm2ddl.auto в производстве.

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

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

Даже руководство пользователя Hibernate советуем избегать использования инструмента hbm2ddl для производственных сред.

6
ответ дан Vlad Mihalcea 19 August 2018 в 00:07
поделиться
5
ответ дан Aniket Kulkarni 30 October 2018 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: