Comment configurer spring-boot pour utiliser la base de données H2 basée sur les fichiers

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

j'ai essayé en changeant simplement les spring.datasource.* propriétés dans mon application.properties le fichier et ils ressembler à quelque chose comme 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 la botte de printemps ignore ces paramètres parce qu'elle ne fait que commencer 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 éléments suivants les dépendances qui peuvent être pertinents pour ce post:

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

Ma compréhension de la documentation et un certain nombre de postes est que la configuration devrait fonctionner mais pas de chance pour moi. Juste pour éviter certaines des erreurs que j'ai essayé et vérifié les éléments suivants:

  1. Mon propriétés de l'application est dans le classspath:
  2. j'ai essayé d'exclure la configuration automatique de l'annotation @EnableAutoConfiguration
  3. j'ai essayé d'injecter un dataSource haricots avec combinaisons d'annotation @Primary,@ConfigurationProperties(prefix = "spring.datasource") et paramétrer les propriétés de façon programmatique avec DataSourceBuilder. Cela entraîne d'autres erreurs liées au type null.

il semble que je manque un concept clé ou quelque chose. N'importe qui peut aider.

mise à jour 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)

`

mise à jour 2: Ajout d'un actionneur et examen du paramètre /configprops. Ce qui est intéressant ici, c'est que ma configuration a été prise et que la base de données existe mais que lorsque l'application tourne elle n'utilise pas ceci 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"
        }
    }  
38
demandé sur Michael Lihs 2016-06-19 04:18:16

5 réponses

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

je suppose que ça pourrait être un problème avec le jdbc.url, modifier 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
22
répondu lenicliu 2017-07-14 13:40:53

j'ajoute cette réponse pour éviter la confusion et les recherches ultérieures.

en fait, j'ai le même problème et aucune réponse n'a fonctionné complètement pour moi plutôt que le mélange pour certaines réponses a fonctionné.

Voici la configuration minimale qui est requise pour persister H2 db dans le démarrage à ressort.

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 le truc. Rien d'autre n'est nécessaire.

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

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

16
répondu Avinash 2017-11-10 06:54:21

en utilisant le paramètre suivant sur l'application.propriétés, j'ai réussi à garder les données ont persisté même après l'arrêt et redémarrer SpringBoot, et même après redémarrer 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 la VM sort, Oui, mais aussi ne faites pas une nouvelle base de données si elle est déjà là.

jdbc:h2:<url>;IFEXISTS=TRUE

spring.jpa.hibernate.ddl-auto = update
1
répondu guntarion 2017-09-04 00:38:11

vient de générer un tout nouveau projet de Botte de printemps avec start.le printemps.io avec quelques dépendances h2, JPA, web, devtools, actuator. Après avoir ajouté une entité simple et un dépôt de données de printemps, la base de données est en effet créée en mémoire par défaut.

ajouter ce qui suit à mon application.properties certainement crée le fichier de base de données dans le 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 me connecter avec la console H2 quand devtools est activé http://localhost:8080/h2-console/.

La prochaine étape logique est de visiter le http://localhost:8080/autoconfig endpoint et vérifier l'état de l'auto-configuration.

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"
}
],

suivi negativeMatches:

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

pouvez-vous essayer ce qui suit et vérifier le rapport d'auto-configuration pour ceux-ci?

0
répondu Brian Clozel 2016-06-19 18:25:02

Créer un fichier .h2.serveur.propriétés dans votre chemin de classe et mettez les choses en dessous et réessayez. Vous pouvez créer ce fichier dans le dossier Ressources.

#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
-2
répondu Sangram Jadhav 2016-06-19 14:19:25