So konfigurieren Sie Spring-Boot für die Verwendung einer dateibasierten H2-Datenbank

Lesezeit: 8 Minuten

Benutzer-Avatar
Bitboy

Ich habe erfolgreich eine Spring-Boot-Anwendung erstellt, die die eingebettete H2-Datenbank im Arbeitsspeicher verwendet. Ich möchte dies jetzt in eine dateibasierte Version ändern, die bestehen bleibt.

Ich habe versucht, einfach das zu ändern spring.datasource.* Eigenschaften in meinem application.properties Datei und sie sehen in etwa so aus:

spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driverClassName=org.h2.Driver`  

Es scheint, als ob Spring Boot diese Einstellungen einfach ignoriert, weil es einfach wie folgt beginnt:

o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false", username="sa"

Mein pom.xml enthält die folgenden Abhängigkeiten, die für diesen Beitrag relevant sein könnten:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.3.5.RELEASE</version>
</parent>
....
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency> 
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

Mein Verständnis aus der Dokumentation und einer Reihe von Beiträgen ist, dass die Konfiguration nur funktionieren sollte, aber kein Glück für mich. Nur um einige der grundlegenden Fehler zu vermeiden, habe ich Folgendes versucht und überprüft:

  1. Meine Anwendungseigenschaften befinden sich im Klassenpfad:
  2. Ich habe versucht, die automatische Konfiguration in der Anmerkung auszuschließen @EnableAutoConfiguration
  3. Ich habe versucht, a zu spritzen dataSource Bohne mit Kombinationen von Anmerkungen @Primary, @ConfigurationProperties(prefix = "spring.datasource") und die Eigenschaften programmgesteuert mit festlegen DataSourceBuilder. Dies verursacht andere Fehler, die sich auf den Typ beziehen null.

Scheint, als würde mir ein Schlüsselkonzept oder so etwas fehlen. Kann jemand helfen.

UPDATE 1: Auszug aus meinem Autokonfigurationsbericht:

Positive matches:
-----------------

    DataSourceAutoConfiguration matched
  - @ConditionalOnClass classes found: javax.sql.DataSource,org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)

   DataSourceAutoConfiguration.DataSourceInitializerConfiguration matched
  - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer; SearchStrategy: all) found no beans (OnBeanCondition)

   DataSourceAutoConfiguration.EmbeddedConfiguration matched
  - embedded database H2 detected (DataSourceAutoConfiguration.EmbeddedDataSourceCondition)
  - @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) found no beans (OnBeanCondition)

   DataSourceAutoConfiguration.JdbcTemplateConfiguration matched
  - existing auto database detected (DataSourceAutoConfiguration.DataSourceAvailableCondition)

   DataSourceAutoConfiguration.JdbcTemplateConfiguration#jdbcTemplate matched
  - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)

   DataSourceAutoConfiguration.JdbcTemplateConfiguration#namedParameterJdbcTemplate matched
  - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)

   DataSourceTransactionManagerAutoConfiguration matched
  - @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)

   DataSourceTransactionManagerAutoConfiguration.TransactionManagementConfiguration matched
  - @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) found no beans (OnBeanCondition)

    H2ConsoleAutoConfiguration matched
  - @ConditionalOnClass classes found: org.h2.server.web.WebServlet (OnClassCondition)
  - found web application StandardServletEnvironment (OnWebApplicationCondition)
  - matched (OnPropertyCondition)

   HibernateJpaAutoConfiguration matched
  - @ConditionalOnClass classes found: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,org.springframework.transaction.annotation.EnableTransactionManagement,javax.persistence.EntityManager (OnClassCondition)
  - found HibernateEntityManager class (HibernateJpaAutoConfiguration.HibernateEntityManagerCondition)

Negative matches:
-----------------

    DataSourceAutoConfiguration.NonEmbeddedConfiguration did not match
  - missing supported DataSource (DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition)

`

UPDATE 2: Aktuator hinzugefügt und Endpunkt betrachtet /configprops. Interessant ist hier, dass meine Konfiguration übernommen wurde und die Datenbank vorhanden ist, aber wenn die Anwendung ausgeführt wird, verwendet sie diese nicht dataSource.

"spring.datasource.CONFIGURATION_PROPERTIES":
    {"prefix":"spring.datasource",
     "properties":{
        "schema":null,
        "data":null,
        "xa":{"dataSourceClassName":null,
               "properties":{}
             },
        "type":null,
        "separator":";",
        "url":"jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE",
        "platform":"all",
        "continueOnError":false,
        "jndiName":null,               
        "sqlScriptEncoding":null,
        "password":"******",
        "name":"testdb",
        "driverClassName":"org.h2.Driver",
        "initialize":true,
        "username":"test"
        }
    }  

Benutzer-Avatar
Avinash

Ich füge diese Antwort hinzu, um Verwirrung und weitere Nachforschungen zu vermeiden.

Eigentlich habe ich das gleiche Problem und keine der Antworten hat für mich vollständig funktioniert, anstatt dass die Mischung für einige Antworten funktioniert hat.

Hier ist die minimale Konfiguration, die erforderlich ist, um H2 db im Spring Boot beizubehalten.

application.properties

# H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2
# Datasource
spring.datasource.url=jdbc:h2:file:~/spring-boot-h2-db
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=update

Hier spring.jpa.hibernate.ddl-auto=update macht den Trick. Nichts anderes ist erforderlich.

Keine Notwendigkeit hinzuzufügen spring-boot-starter-jdbc in pom.xml

Es müssen keine Parameter in der jdbc-URL hinzugefügt werden.

  • Dies sollte die akzeptierte Antwort sein. Das spring.jpa.hibernate.ddl-auto=update war alles, was ich brauchte, damit es funktionierte.

    – Jotus

    2. Oktober 2018 um 12:46 Uhr

  • Sie könnten es von application.xml zu application.properties bearbeiten (weil Sie Spring Boot erwähnen)

    – Anna Klein

    17. Juli 2019 um 17:07 Uhr

Benutzer-Avatar
lenicliu

Beziehen auf http://www.h2database.com/html/cheatSheet.html

Ich denke, es könnte ein Problem mit der jdbc.url sein, ändern Sie es wie folgt:

# from:
spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE

# to:
spring.datasource.url=jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE

  • danke, aber die Konfiguration erstellt tatsächlich eine laufende Datenbankinstanz mit der richtigen URL (wie konfiguriert, siehe UPDATE 2 oben). Problem ist, dass die Anwendung es nicht verwendet. Es scheint die Standardeinstellung ‘EmbeddedDatabase’ zu verwenden

    – Bitboy

    28. Juni 2016 um 12:32 Uhr

  • hast du spring-boot-starter-jdbc in pom.xml hinzugefügt? hier ein Beispielprojekt: github.com/lenicliu/eg-spring/tree/master/eg-spring-boot/…Flyway für die Migration und h2database zum Einbetten der Datenbank nach Dateimodus.

    – lenicliu

    28. Juni 2016 um 15:39 Uhr


  • Das Hinzufügen von spring-boot-starter-jdbc zur pom.xml hat funktioniert! Vielen Dank. Wäre toll zu wissen, warum das behoben wurde.

    – Bitboy

    30. Juni 2016 um 12:57 Uhr


Benutzer-Avatar
guntarion

Mit der folgenden Einstellung in application.properties schaffe ich es, dass die Daten auch nach dem Herunterfahren und Neustarten von SpringBoot und sogar nach dem Neustart des Computers bestehen bleiben.

spring.datasource.name=japodb
spring.datasource.initialize=false
spring.datasource.driverClassName=org.h2.Driver

spring.datasource.url=jdbc:h2:file:~/japodb;DB_CLOSE_ON_EXIT=FALSE;IFEXISTS=TRUE;DB_CLOSE_DELAY=-1;

Schließen Sie keine Datenbank, wenn die VM beendet wirdja, aber erstellen Sie auch keine neue Datenbank, wenn sie bereits vorhanden ist.

jdbc:h2:<url>;IFEXISTS=TRUE

spring.jpa.hibernate.ddl-auto = update

  • Hallo @guntarion, siehe Vorschlag von lenicliu oben. Das Problem wurde behoben, indem spring-boot-starter-jdbc zur pom.xml hinzugefügt wurde, was funktionierte.

    – Bitboy

    5. September 2017 um 6:32 Uhr

  • Ja, ich habe den Vorschlag bemerkt und ausprobiert. Aber es funktioniert nicht.

    – Guntarion

    6. September 2017 um 6:00 Uhr

  • Es war das “spring.jpa.hibernate.ddl-auto = update”, das den Trick für mich getan hat. Habe alle anderen Tipps hier ausprobiert.

    – Gjermund Bjaanes

    6. September 2017 um 17:34 Uhr

Benutzer-Avatar
Jafar Karuthedath

Hier ist die Konfiguration, die für mich funktioniert hat

#File based h2 DB
spring.datasource.url=jdbc:h2:file:C:/temp/test_db;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;DB_CLOSE_DELAY=-1
#In memory
#spring.datasource.url=jdbc:h2:mem:testdb:security_permission;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.jpa.hibernate.ddl-auto=update
spring.datasource.username=user
spring.datasource.password=admin
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
#Use datasource.initialization-mode if you are configured to use file based h2 and data.sql
spring.datasource.initialization-mode=always
spring.jpa.defer-datasource-initialization=true

Wenn ich die Dateninitialisierung mit data.sql verwendet habe, muss ich die folgende Option verwenden, damit es funktioniert

spring.datasource.initialization-mode=always

Nachdem die Daten initialisiert wurden, können sie auf nie gesetzt werden

spring.datasource.initialization-mode=never

Ich habe gerade ein brandneues Spring Boot-Projekt mit start.spring.io mit einigen Abhängigkeiten erstellt h2, JPA, web, devtools, actuator. Nach dem Hinzufügen eines einfachen Entity- und Spring Data-Repositorys wird die Datenbank tatsächlich standardmäßig im Speicher erstellt.

Folgendes zu meiner hinzufügen application.properties erstellt die Datenbankdatei definitiv an der richtigen Stelle:

spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driverClassName=org.h2.Driver

Ich kann mich sogar mit der H2-Konsole verbinden, wenn devtools aktiviert ist http://localhost:8080/h2-console/.

Der nächste logische Schritt ist der Besuch der http://localhost:8080/autoconfig Endpunkt und überprüfen Sie den Status der automatischen Konfiguration.

In meinem Fall ist das folgende positiveMatches:

DataSourceAutoConfiguration.NonEmbeddedConfiguration: [
{
  condition: "DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition",
  message: "supported DataSource class found"
},
{
  condition: "OnBeanCondition",
  message: "@ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) found no beans"
}
],

und das folgende in negativeMatches:

DataSourceAutoConfiguration.EmbeddedConfiguration: [
{
  condition: "DataSourceAutoConfiguration.EmbeddedDataSourceCondition",
  message: "existing non-embedded database detected"
}
],

Könnten Sie Folgendes versuchen und den automatischen Konfigurationsbericht darauf überprüfen?

  • Hallo Brian, meine sind eine Umkehrung von Ihnen: Positive Übereinstimmungen umfassen „DataSourceAutoConfiguration.EmbeddedConfiguration“ und negative Übereinstimmungen umfassen „DataSourceAutoConfiguration.NonEmbeddedConfiguration“. Ich mache mir keine Sorgen, dass die DB eingebettet ist, aber ich mache mir Sorgen, dass meine Daten in der standardmäßig eingebetteten In-Memory-Datenbank gespeichert sind. Ich möchte, dass die Daten unter der von mir konfigurierten dateibasierten URL gespeichert werden.

    – Bitboy

    21. Juni 2016 um 2:07 Uhr

Benutzer-Avatar
Sangram Jadhav

Erstellen Sie eine Datei .h2.server.properties in Ihren Klassenpfad und setzen Sie die Dinge darunter und versuchen Sie es erneut. Sie können diese Datei im Ressourcenordner erstellen.

#H2 Server Properties
0=H2 File|org.h2.Driver|jdbc\:h2\:file\:~/test;DB_CLOSE_ON_EXIT=FALSE

# Enable if you want other applications to connect
#webAllowOthers=true
#webPort=8082
#webSSL=false

  • Hallo Brian, meine sind eine Umkehrung von Ihnen: Positive Übereinstimmungen umfassen „DataSourceAutoConfiguration.EmbeddedConfiguration“ und negative Übereinstimmungen umfassen „DataSourceAutoConfiguration.NonEmbeddedConfiguration“. Ich mache mir keine Sorgen, dass die DB eingebettet ist, aber ich mache mir Sorgen, dass meine Daten in der standardmäßig eingebetteten In-Memory-Datenbank gespeichert sind. Ich möchte, dass die Daten unter der von mir konfigurierten dateibasierten URL gespeichert werden.

    – Bitboy

    21. Juni 2016 um 2:07 Uhr

1206480cookie-checkSo konfigurieren Sie Spring-Boot für die Verwendung einer dateibasierten H2-Datenbank

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy