2017-01-25 3 views
0

Ich habe eine kleine Anwendung mit Spring Boot entwickelt, die HSQLDB als Datenbank verwendet, um Benutzer vorerst zu speichern. Ich möchte die Datenbank in Mavens Ressourcenordner speichern. Meine application.properties Datei enthält die folgende Konfiguration:HSQLDB in Ressourcen innerhalb eines WAR

#... 
spring.datasource.url=jdbc:hsqldb:file:src/main/resources/database/dashboard 
#... 

Also, wenn ich die Anwendung mit Java starten (Rechtsklick auf meiner Anwendung Main() und ausführendes Frühling Boot-App), wird die Datenbank direkt gespeichert.

Nachdem jedoch eine WAR-Datei mit mvn clean install spring-boot:repackage in Tomcat deployiert und ausgeführt wurde, wird die Datenbank nicht in der explodierten WAR-Datei gespeichert.

Meine Frage ist, wie kann ich spring.datasource.url=jdbc:hsqldb:file:* Eigenschaft zu speichern, die Datenbank innerhalb Maven Resources-Verzeichnis (was immer noch nach dem Explodieren der WAR zeigen)? Kann ich eine Umgebungsvariable wie in pom.xml verwenden?

EDIT die Antworten von @Steve C und @fredt Da habe ich erkannt, dass die Datenbank nicht im Krieg gespeichert werden soll. Stattdessen werde ich es im Home-Verzeichnis spring.datasource.url=jdbc:hsqldb:file:~/tomcat_webapp_data/dashboard/database des Benutzers speichern. Vielen Dank!

+1

Sie scheinen einen relativen Pfad zu verwenden, um auf hsqldb zu zeigen. Der Speicherort von Hsql ist relativ zum Arbeitsverzeichnis (wahrscheinlich bin/in tomcat /). Sie sollten einen absoluten Pfad verwenden. – Redlab

+1

1) Bessere Verwendung von Apache Derby, HSQLDB wird immer vollständig in RAM-Speicher geladen - dies könnte Ihre App mit größeren DB 2 töten) ändern Sie einfach das Build-Skript, um das gesamte db-Verzeichnis into war enthalten, dann achten Sie auf den richtigen Pfad zu db Datei im Server-Container –

+0

@Redlab Ich möchte keinen absoluten Pfad verwenden, da ich die Art des Systems nicht kenne, wo der WAR plaziert wird (Linux, Win ...), noch ob er ausgeführt wird mit Java. – russellhoff

Antwort

2

Die Verzeichnisse und Inhalte einer WAR-Datei sind schreibgeschützt.

Sie können das Flag read_only in der Datei .properties der HSQLDB-Datenbank vor dem Einfügen in WAR setzen. Sie greifen auf diese Art von Datenbank mit einer jdbc:hsqldb:res:<path> URL zu.

Wenn Sie Daten in einer persistenten und aktualisierbaren Datenbank speichern möchten, stellen Sie eine Verbindung zur (zunächst nicht existierenden) Datenbank innerhalb Ihrer Anwendung her und richten Sie ihre Tabellen ein, falls sie noch nicht mit Daten von einer Ressource existieren. Sie können dann Daten speichern. Der Datenbankpfad sollte außerhalb der Verzeichnisse liegen, die für JARS und Ressourcen verwendet werden.

Im Gegensatz zu einem der Kommentare ist HSQLDB nicht auf das Speichern von Daten im Arbeitsspeicher beschränkt und kann plattenbasierte Tabellen, sogenannte CACHED-Tabellen, enthalten.

Sie können eine Variable in die Datenbank-URL aufnehmen, um eine vordefinierte Eigenschaft vom Webserver abzurufen. Zum Beispiel:

jdbc:hsqldb:file:${mydbpath} 

Siehe http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_variables_url

1

Maven src/main/resources Verzeichnis ein Kompilierzeit Pfad, kein Laufzeitpfad.

Wenn Sie eine JAR-Datei erstellen, wird alles in src/main/resources in den Stamm des JAR kopiert.

Wenn Sie eine WAR-Datei erstellen, wird alles in src/main/resources in den Stamm des Verzeichnisses/WEB-INF/classes im Krieg kopiert.

Nun zeigt Ihre JDBC-URL jdbc:hsqldb:file:src/main/resources/database/dashboard eine Datei mit einem relativen Pfad an. Zur Laufzeit ist dieser Pfad relativ zum aktuellen Arbeitsverzeichnis - und es ist unwahrscheinlich, dass er zur Laufzeit existiert.

Wenn Sie wirklich die Datenbank innerhalb Ihrer WAR aufbauen wollen, dann gegeben:

  • Sie eine Explosions WAR-Datei sind die Bereitstellung von (es unmöglich ist, den Inhalt der WAR-Datei selbst zu schreiben);

  • Sie wirklich wirklich wollen die Datenbank innerhalb der explodierten WAR zu speichern;

  • Sie möchten es in WEB-INF/database/dashboard setzen (es gibt Sicherheitsauswirkungen, wenn Sie außerhalb des Verzeichnisses WEB-INF speichern);

dann können Sie die JDBC-URL berechnen etwas mit wie:

... 
String databaseDirectoryName = servletContext.getRealPath("WEB-INF/database"); 
File databaseDirectory = new File(databaseDirectoryName); 
if (!databaseDirectory.exists()) { 
    if (!databaseDirectory.mkdirs()) { 
     throw new RuntimeException("Failed to create database directory"); 
    } 
} 
File databaseFile = new File(databaseDirectory, "dashboard"); 
String jdbcURL = "jdbc:hsqldb:" + databaseFile.toURI(); 
... 

bekommen, dass in Ihrem Spring-Konfiguration eine Übung für Sie ist; aber mit @Configuration und @Bean Federn als eine Möglichkeit, dies zu tun - Sie müssen nur Zugriff auf die bei Spring Konfigurationszeit erhalten.