Я работал над своим проектом загрузочного приложения Spring и заметил, что иногда возникает ошибка тайм-аута подключения к моей базе данных на другом сервере (SQL Server). Это происходит особенно, когда я пытаюсь выполнить миграцию скрипта, FlyWay
но после нескольких попыток он работает.
Затем я заметил, что не указал spring.jpa.hibernate.ddl-auto
в своем файле свойств. Я провел небольшое исследование и обнаружил, что его рекомендуется добавлять
spring.jpa.hibernate.ddl-auto= create-drop
в разработке. И измените его на: spring.jpa.hibernate.ddl-auto= none
in production.
Но на самом деле я не понимал, как это работает и как спящий режим генерирует схему базы данных с использованием create-drop
или none
значения. Не могли бы вы объяснить технически, как это действительно работает, и каковы рекомендации по использованию этого свойства в разработке и на рабочем сервере. Спасибо
none
но вы можете захотеть, чтобы ваши таблицы Hibernate Search и Envers создавались с использованием,update
поскольку они внутренне управляются этими проектами, и вы не хотите управлять ими вручную. Сейчас мы контролируем это глобально для всех таблиц, независимо от их происхождения / источника. Это будет еще одной причиной для использования параметров, зависящих от производителя, если вы хотите это использовать.Ответы:
Для записи
spring.jpa.hibernate.ddl-auto
свойство является специфичным для Spring Data JPA и является их способом указать значение, которое в конечном итоге будет передано в Hibernate под известным ему свойствомhibernate.hbm2ddl.auto
.Значения
create
,create-drop
,validate
и вupdate
основном влияют как инструмент управление схемой будет управлять схемой базы данных при запуске.Например,
update
операция будет запрашивать API-интерфейс драйвера JDBC для получения метаданных базы данных, а затем Hibernate сравнивает объектную модель, которую он создает, на основе чтения ваших аннотированных классов или сопоставлений HBM XML, и будет пытаться настроить схему на лету.update
Операция, например , будет пытаться добавлять новые столбцы, ограничения и т.д. , но никогда не будет удалить столбец или ограничение , которое не могло существовать ранее , но больше не делает в рамках объектной модели из предыдущего выполнения.Как правило, в сценариях тестового примера вы, скорее всего, будете использовать
create-drop
для создания схемы, в тестовый пример добавляются некоторые фиктивные данные, вы запускаете тесты, а затем во время очистки тестового примера объекты схемы удаляются, оставляя пустую базу данных.В разработке часто можно увидеть, как разработчики используют
update
автоматическое изменение схемы для добавления новых дополнений при перезапуске. Но опять же поймите, это не удаляет столбец или ограничение, которые могут существовать из предыдущих выполнений, которые больше не нужны.В производстве часто настоятельно рекомендуется использовать
none
это свойство или просто не указывать его. Это связано с тем, что администраторы баз данных обычно используют сценарии миграции на предмет изменений базы данных, особенно если ваша база данных используется несколькими службами и приложениями.источник
validate
в производственной среде?validate
в производственной среде , но, как правило, это должна быть настройка, которую вы используете в своей среде качества / тестирования, чтобы убедиться, что сценарии базы данных, которые вы написали или применили к инструменту миграции базы данных, точны. Еще одна причина не использоватьvalidate
в производственной среде заключается в том, что это может стать узким местом во время процесса запуска вашего приложения, особенно если ваша объектная модель довольно обширна по размеру или если в игру вступают другие факторы, связанные с сетью.order
это то, что синтаксический анализатор SQL неправильно интерпретирует, поскольку это ключевое слово, если оно не экранируется.