Ich habe an meinem Spring-Boot-App-Projekt gearbeitet und festgestellt, dass manchmal ein Verbindungszeitüberschreitungsfehler zu meiner Datenbank auf einem anderen Server (SQL Server) auftritt. Dies geschieht insbesondere, wenn ich versuche, eine Skriptmigration mit FlyWay
durchzuführen, dies funktioniert jedoch nach mehreren Versuchen.
Dann bemerkte ich, dass ich nicht spring.jpa.hibernate.ddl-auto
in meiner Eigenschaftendatei angegeben habe. Ich habe einige Nachforschungen angestellt und festgestellt, dass es empfehlenswert ist, diese spring.jpa.hibernate.ddl-auto= create-drop
in der Entwicklung hinzuzufügen
. Und ändern Sie es in: spring.jpa.hibernate.ddl-auto= none
in Produktion.
Aber ich habe nicht wirklich verstanden, wie es wirklich funktioniert und wie der Ruhezustand das Datenbankschema mit create-drop
oder none
Wert generiert . Können Sie bitte technisch erklären, wie es wirklich funktioniert und welche Empfehlungen für die Verwendung dieser Eigenschaft in der Entwicklung und auf einem Produktionsserver gelten? Danke dir
none
aber Sie möchten möglicherweise, dass Ihre Hibernate Search- und Envers-Tabellen mithilfe generiert werden,update
da sie intern von diesen Projekten verwaltet werden und Sie diese nicht manuell selbst verwalten möchten. Im Moment steuern wir dies global für alle Tabellen, unabhängig von ihrer Herkunft / Quelle. Dies würde den Grund für die Verwendung herstellerspezifischer Optionen fördern, wenn Sie diese verwenden möchten.Antworten:
Für den Datensatz ist die
spring.jpa.hibernate.ddl-auto
Eigenschaft Spring Data JPA-spezifisch und dient dazu, einen Wert anzugeben, der schließlich unter der ihm bekannten Eigenschaft an Hibernate übergeben wirdhibernate.hbm2ddl.auto
.Die Werte
create
,create-drop
,validate
, undupdate
im Grunde beeinflussen , wie das Schema WZV das Datenbankschema beim Start manipulieren.Die
update
Operation fragt beispielsweise die API des JDBC-Treibers ab, um die Datenbankmetadaten abzurufen, und vergleicht dann das erstellte Objektmodell anhand des Lesens Ihrer mit Anmerkungen versehenen Klassen oder HBM-XML-Zuordnungen und versucht, das Schema im laufenden Betrieb anzupassen.Die
update
Operation versucht beispielsweise, neue Spalten, Einschränkungen usw. hinzuzufügen, entfernt jedoch niemals eine Spalte oder Einschränkung, die möglicherweise zuvor vorhanden war, jedoch nicht mehr als Teil des Objektmodells aus einem vorherigen Lauf.In der Regel werden Sie in Testfallszenarien wahrscheinlich verwenden
create-drop
, um Ihr Schema zu erstellen, Ihr Testfall fügt einige Scheindaten hinzu, Sie führen Ihre Tests aus und während der Testfallbereinigung werden die Schemaobjekte gelöscht, sodass eine leere Datenbank verbleibt.In der Entwicklung ist es häufig üblich, dass Entwickler
update
das Schema automatisch ändern, um beim Neustart neue Ergänzungen hinzuzufügen. Aber verstehen Sie noch einmal, dies entfernt keine Spalte oder Einschränkung, die möglicherweise aus früheren Ausführungen vorhanden ist und nicht mehr erforderlich ist.In der Produktion wird häufig empfohlen
none
, diese Eigenschaft zu verwenden oder einfach nicht anzugeben. Dies liegt daran, dass DBAs häufig Migrationsskripts auf Datenbankänderungen überprüfen, insbesondere wenn Ihre Datenbank für mehrere Dienste und Anwendungen freigegeben ist.quelle
validate
in Production Env?validate
in der Produktion verwendet werden. Dies sollte jedoch normalerweise eine Einstellung sein, die Sie in Ihrer Qualitäts- / Testumgebung verwenden, um zu überprüfen, ob die Datenbankskripte, die Sie geschrieben oder auf Ihr Datenbankmigrationstool angewendet haben, korrekt sind. Ein weiterer Grund, warum Sie es nichtvalidate
in der Produktion verwenden sollten, besteht darin, dass es während des Startvorgangs Ihrer Anwendung zu einem Engpass kommen kann, insbesondere wenn Ihr Objektmodell sehr umfangreich ist oder wenn andere netzwerkbezogene Faktoren ins Spiel kommen.order
der SQL-Parser ihn falsch interpretiert, da dies ein Schlüsselwort ist, wenn es nicht maskiert wird.