DB-Schema-Evolution mit LiquiBase

60 Aufrufe

Veröffentlicht am

Vortrag von Dirk Weil auf dem Expertenkreis Java, Bielefeld 29.06.2017

Veröffentlicht in: Software
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

DB-Schema-Evolution mit LiquiBase

  1. 1. DB-Schema-Evolution mit LiquiBase Expertenkreis Java, 29.06.2017, GEDOPLAN Dirk Weil, GEDOPLAN GmbH
  2. 2. Dirk Weil GEDOPLAN GmbH, Bielefeld GEDOPLAN IT Consulting Konzeption, Realisierung von IT-Lösungen GEDOPLAN IT Training Seminare in Berlin, Bielefeld, on-site Java EE seit 1998 Vorträge, Veröffentlichungen DB-Schema-Evolution mit LiquiBase 2
  3. 3. Weiterentwicklung des DB-Schemas Weiterentwicklung der Anwendung erfordert Hinzufügen von Tabellen und Spalten Entfernen von Tabellen und Spalten Umbenennen von Tabellen und Spalten … Durchführung manuell (SQL Tool) automatisiert durch JPA-Standard-Properties automatisiert durch proprietäre Properties der Provider automatisiert durch dedizierte Tools DB-Schema-Evolution mit LiquiBase 3
  4. 4. Schema Generation Properties im Standard Seit JPA 2.1 können Properties zur Schema-Erzeugung in persistence.xml eingetragen werden: DB-Schema-Evolution mit LiquiBase 4 Property javax.persistence .schema-generation.… Bedeutung database.action scripts.action Auswahl der Befehle, die in der DB ausgeführt bzw. in die Ziel-Skripte geschrieben werden. Erlaubte Werte sind none, create, drop-and- create und drop. create-source drop-source Auswahl, ob das Erzeugen bzw. Löschen auf Basis der Metadaten der persistenten Klassen oder durch Quell-Skripte erfolgen soll. Erlaubte Werte: metadata, script, metadata-then-script, script-then- metadata. create-script-source drop-script-source Quell-Skripte zum Erzeugen bzw. Löschen von Tabellen (ignoriert, falls create-source bzw. drop-souce den Wert metadata haben). scripts.create-target scripts.drop-target Ziel-Skripte zum Erzeugen bzw. Löschen von Tabellen (ignoriert, falls scripts.action den Wert none hat).
  5. 5. Schema Generation Properties im Standard Beispiele: Erzeugen von fehlenden Tabellen Löschen und Neuerzeugung aller Tabellen DB-Schema-Evolution mit LiquiBase 5 <persistence-unit …> <properties> <property name="javax.persistence.schema-generation.database.action" value="create" /> <property name="javax.persistence.schema-generation.create-source" value="metadata" /> <persistence-unit …> <properties> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" /> <property name="javax.persistence.schema-generation.create-source" value="metadata" />
  6. 6. Schema Generation Properties im Standard Die Schema-Generierung mittels Standard-Properties ist recht limitiert: Tabellen können nur komplett neu erzeugt werden Quell- und Zielskripte müssen absolut adressiert werden Alternative: Schema-Generierungs-Properties der Provider DB-Schema-Evolution mit LiquiBase 6 <persistence-unit …> <properties> <property name="eclipselink.ddl-generation" value="create-or-extend-tables" /> <property name="eclipselink.ddl-generation.output-mode" value="database" /> <property name="hibernate.hbm2ddl.auto" value="update" />
  7. 7. Schema Management mit Liquibase Open Source: http://www.liquibase.org DB-unabhängig Durchführung beliebiger DB-Änderungen (DDL und DML) Verwaltet Änderungen in Skripten (sog. Changelogs, XML-basiert) DB-Schema-Evolution mit LiquiBase 7 Changelogs DATABASECHANGELOG TABLE1 TABLE2 Liquibase
  8. 8. Schema Management mit Liquibase Changelogs können willkürlich aufgeteilt und referenziert werden Empfehlung: Ablage als Ressource-Dateien Aufteilung nach Komponenten und Versionen DB-Schema-Evolution mit LiquiBase 8 <databaseChangeLog …> <changeSet id="create person" author="demo"> <createTable tableName="JPA_LB_PERSON"> <column name="id" type="varchar(10)"> <constraints primaryKey="true" nullable="false" /> </column> <column name="lastname" type="varchar(50)"/> <column name="firstname" type="varchar(50)"/> </createTable> </changeSet> <databaseChangeLog …> <include file="liquibase/demo/V1.xml" />
  9. 9. Schema Management mit Liquibase Ausführung per Maven Plugin Konfiguration Aufruf mvn liquibase:update DB-Schema-Evolution mit LiquiBase 9 <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.5.3</version> <configuration> <changeLogFile>liquibase/changelog.xml</changeLogFile> <driver>org.h2.Driver</driver> <url>jdbc:h2:~/h2/seminar;AUTO_SERVER=TRUE</url> <username>seminar</username> <password>seminar</password>
  10. 10. Schema Management mit Liquibase Ausführung per API Library Dependency Aufruf DB-Schema-Evolution mit LiquiBase 10 <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>3.5.3</version> </dependency> Connection connection = …; // JDBC connection new Liquibase("liquibase/changelog.xml", new ClassLoaderResourceAccessor(), DatabaseFactory.getInstance() .findCorrectDatabaseImplementation(new JdbcConnection(connection))) .update((Contexts) null);
  11. 11. Schema Management mit Liquibase Ausführung mittels CDI Extension Library Dependency Konfiguration durch CDI Producer (s. nächste Seite) Aufruf automatisch bei Container-Initialisierung DB-Schema-Evolution mit LiquiBase 11 <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-cdi</artifactId> <version>3.5.3</version> </dependency>
  12. 12. Schema Management mit Liquibase CDI Producer zur Konfiguration der Extension DB-Schema-Evolution mit LiquiBase 12 public class LiquibaseProducer { @Resource(lookup = "jdbc/seminar") DataSource dataSource; @Produces @LiquibaseType CDILiquibaseConfig getConfig() { CDILiquibaseConfig config = new CDILiquibaseConfig(); config.setChangeLog("liquibase/changeLog.xml"); return config; } @Produces @LiquibaseType ResourceAccessor getResourceAccessor() { return new ClassLoaderResourceAccessor(getClass().getClassLoader()); @Produces @LiquibaseType DataSource getDataSource() { return this.dataSource; }
  13. 13. Schema Management mit Liquibase Exemplarische Weiterentwicklung der Anwendung DB-Schema-Evolution mit LiquiBase 13 @Entity @Table(name = "JPA_LB_PERSON") public class Person { @Id private String id; private String lastName; private String firstName; @Entity @Table(name = "JPA_LB_PERSON") public class Person { @Id private String id; private String lastName; private String firstName; private String fullName;
  14. 14. Schema Management mit Liquibase Exemplarische Weiterentwicklung der Anwendung DB-Schema-Evolution mit LiquiBase 14 <databaseChangeLog …> <changeSet id="add fullname" author="demo"> <addColumn tableName="JPA_LB_PERSON"> <column name="fullname" type="varchar(101)"/> </addColumn> </changeSet> <changeSet id="fill fullname" author="demo"> <sql> update JPA_LB_PERSON set fullname = {fn concat(firstname, ' ', lastname)} </sql> <rollback/> </changeSet>
  15. 15. Schema Management mit Liquibase Exemplarische Weiterentwicklung der Anwendung mvn liquibase:update, API Call oder CDI Producer ergänzt Spalte fullname füllt fullname DB-Schema-Evolution mit LiquiBase 15
  16. 16. Schema Management mit Liquibase Exemplarische Weiterentwicklung der Anwendung Rücknahme von Änderungen: mvn liquibase:update -Dliquibase.rollbackCount=2 DB-Schema-Evolution mit LiquiBase 16
  17. 17. Schema Management mit Liquibase Weitere Features Changelog: Format auch YAML oder JSON Preconditions zur Prüfung von Vorbedingungen Contexts zur Unterscheidung von Umgebungen, z. B. Test vs. Produktion Parameter, setzbar bspw. aus System Properties Aus bestehender DB generierbar Aus Diff zwischen DBs generierbar Ausführung auch als Servlet Listener, Spring Listener Diverse weitere Kommandos für Diffs, SQL Output, Dokumentation DB-Schema-Evolution mit LiquiBase 17

×