Pracowałem nad projektem aplikacji Spring Boot i zauważyłem, że czasami występuje błąd przekroczenia limitu czasu połączenia z moją bazą danych na innym serwerze (SQL Server). Dzieje się tak szczególnie, gdy próbuję wykonać migrację skryptu, FlyWay
ale działa po kilku próbach.
Potem zauważyłem, że nie wskazałem spring.jpa.hibernate.ddl-auto
w moim pliku właściwości. Zrobiłem kilka badań i stwierdziłem, że zaleca się dodanie
spring.jpa.hibernate.ddl-auto= create-drop
w rozwoju. I zmień to na: spring.jpa.hibernate.ddl-auto= none
w produkcji.
Ale tak naprawdę nie rozumiałem, jak to naprawdę działa i jak hibernacja generuje schemat bazy danych przy użyciu create-drop
lub none
wartości. Czy możesz wyjaśnić technicznie, jak to naprawdę działa i jakie są zalecenia dotyczące używania tej właściwości w programowaniu i na serwerze produkcyjnym. Dziękuję Ci
none
ale możesz chcieć, aby tabele Hibernate Search i Envers były generowane przy użyciu,update
ponieważ są wewnętrznie zarządzane przez te projekty i nie chcesz zarządzać nimi ręcznie. Obecnie kontrolujemy to globalnie dla wszystkich tabel, niezależnie od ich pochodzenia / źródła. To dalszy powód do korzystania z opcji specyficznych dla dostawcy, jeśli chcesz ich użyć.Odpowiedzi:
Dla przypomnienia,
spring.jpa.hibernate.ddl-auto
nieruchomość jest wiosna danych JPA specyficzne i jest ich sposób określić wartość, która zostanie ostatecznie przekazany do Hibernate pod nieruchomości to wiehibernate.hbm2ddl.auto
.Wartości
create
,create-drop
,validate
, iupdate
zasadniczo wpływają na sposób zarządzania narzędziami schemat będzie manipulować schematu bazy danych przy starcie.Na przykład
update
operacja wysyła zapytanie do interfejsu API sterownika JDBC w celu uzyskania metadanych bazy danych, a następnie Hibernate porównuje model obiektów, który tworzy na podstawie odczytu klas z adnotacjami lub mapowań XML HBM i podejmuje próbę dostosowania schematu w locie.Na
update
przykład operacja spróbuje dodać nowe kolumny, ograniczenia itp., Ale nigdy nie usunie kolumny lub ograniczenia, które mogło istnieć wcześniej, ale nie jest już częścią modelu obiektowego z poprzedniego uruchomienia.Zazwyczaj w scenariuszach przypadków testowych prawdopodobnie użyjesz
create-drop
, aby utworzyć schemat, Twój przypadek testowy doda pewne dane próbne, uruchomisz testy, a następnie podczas czyszczenia przypadku testowego obiekty schematu zostaną usunięte, pozostawiając pustą bazę danych.W fazie rozwoju często zdarza się, że programiści używają
update
do automatycznego modyfikowania schematu w celu dodania nowych dodatków po ponownym uruchomieniu. Ale znowu zrozum, nie usuwa to kolumny ani ograniczenia, które mogą istnieć z poprzednich wykonań, które nie są już potrzebne.W środowisku produkcyjnym często zaleca się użycie
none
tej właściwości lub po prostu jej nieokreślanie. Dzieje się tak, ponieważ administratorzy baz danych często przeglądają skrypty migracji pod kątem zmian w bazie danych, zwłaszcza jeśli baza danych jest współużytkowana przez wiele usług i aplikacji.źródło
validate
w kopercie produkcyjnej?validate
w środowisku produkcyjnym, ale zazwyczaj powinno to być ustawienie używane w środowisku testowym / jakościowym w celu sprawdzenia, czy skrypty bazy danych, które napisałeś lub zastosowałeś do narzędzia migracji bazy danych, są dokładne. Innym powodem, dla którego nie należy używać govalidate
w produkcji, jest to, że może to stanowić wąskie gardło podczas procesu uruchamiania aplikacji, szczególnie jeśli model obiektowy ma dość duży rozmiar lub jeśli w grę wchodzą inne czynniki związane z siecią.order
jest nieprawidłowo interpretowane przez parser SQL, ponieważ jest to słowo kluczowe, jeśli nie jest używane.