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:
@EnableAutoConfiguration
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"
}
}
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
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.
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
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à?