web-dev-qa-db-fra.com

Comment configurer spring-boot pour utiliser une base de données H2 basée sur un fichier

J'ai créé avec succès une application de démarrage de printemps qui utilise la base de données intégrée H2 en mémoire. Je voudrais maintenant changer ceci pour une version basée sur fichier qui persistera. 

J'ai juste essayé de changer les propriétés spring.datasource.* dans mon fichier application.properties et elles ressemblent à ceci:

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`  

Il semble que Spring Boot ignore ces paramètres, car il commence comme suit:

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'

Mon pom.xml contient les dépendances suivantes pouvant être pertinentes pour ce message:

<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>

D'après ce que j'ai compris de la documentation et de plusieurs publications, la configuration devrait fonctionner, mais pas de chance pour moi. Juste pour éviter certaines des erreurs de base, j'ai essayé et vérifié les points suivants:

  1. Les propriétés de mon application sont dans la classe:
  2. J'ai essayé d'exclure la configuration automatique dans l'annotation @EnableAutoConfiguration
  3. J'ai essayé d'injecter un bean dataSource avec des combinaisons d'annotation @Primary, @ConfigurationProperties(prefix = "spring.datasource") et de définir les propriétés par programme avec DataSourceBuilder. Cela provoque d'autres erreurs liées au type null

On dirait que je manque un concept clé ou quelque chose. Quelqu'un peut-il aider. 

UPDATE 1: Extrait de mon rapport de configuration automatique:

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: ajout de l'actionneur et examen du point final /configprops. Ce qui est intéressant ici, c'est que ma configuration a été prise et que la base de données existe, mais lorsque l'application est exécutée, elle n'utilise pas cette 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"
        }
    }  
43
bitboy

Reportez-vous à http://www.h2database.com/html/cheatSheet.html

Je suppose que cela pourrait être un problème avec le fichier jdbc.url, changez-le comme ceci:

# 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
28
lenicliu

J'ajoute cette réponse pour éviter toute confusion et recherches plus poussées.

En fait, j’ai le même problème et aucune des réponses n’a fonctionné complètement pour moi plutôt que la combinaison de certaines réponses a fonctionné. 

Voici la configuration minimale requise pour conserver H2 db au démarrage du printemps.

application.xml

# 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

Ici, spring.jpa.hibernate.ddl-auto=update fait l'affaire. Rien d'autre n'est requis.

Pas besoin d'ajouter spring-boot-starter-jdbc dans pom.xml

Pas besoin d'ajouter un paramètre dans l'URL de jdbc.

25
Avinash

En utilisant le paramètre suivant sur application.properties, je parviens à conserver les données persistantes même après l’arrêt et le redémarrage de SpringBoot et même après le redémarrage de l’ordinateur. 

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;

Ne fermez pas une base de données lorsque VM se ferme , oui, mais ne créez pas de nouvelle base de données si elle existe déjà.

jdbc:h2:<url>;IFEXISTS=TRUE

spring.jpa.hibernate.ddl-auto = update
2
guntarion

Vient de générer un tout nouveau projet Spring Boot avec start.spring.io avec quelques dépendances h2, JPA, web, devtools, actuator. Après avoir ajouté un référentiel Entity et Spring Data simple, la base de données est bien créée en mémoire par défaut.

Ajouter ce qui suit à mon application.properties crée définitivement le fichier de base de données au bon endroit:

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

Je peux même y connecter avec la console H2 lorsque devtools est activé http://localhost:8080/h2-console/.

La prochaine étape logique consiste à visiter le noeud final http://localhost:8080/autoconfig et à vérifier l'état de la configuration automatique.

Dans mon cas, ce qui suit est 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"
}
],

et les éléments suivants dans negativeMatches:

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

Pourriez-vous essayer ce qui suit et vérifier le rapport de configuration automatique pour ceux-là?

0
Brian Clozel