web-dev-qa-db-fra.com

Comment démarrer l'application Spring-Boot sans dépendre de la base de données?

J'utilise "Spring-boot + Hibernate4 + mysql" pour mon application. Dans le cadre de laquelle j'ai une exigence où mon application de démarrage sprint devrait pouvoir démarrer même lorsque la base de données est en panne. Actuellement, il donne l'exception ci-dessous lorsque j'essaie de démarrer mon application de démarrage de printemps sans que la base de données ne soit active.

J'ai fait beaucoup de recherches et j'ai découvert que cette exception était liée à hibernate.temp.use_jdbc_metadata_defaults propriété.

J'ai essayé de le définir dans "application.yml" de Spring Boot mais la valeur de cette propriété n'est pas reflétée lors de l'exécution.

Trace de pile d'exception:

2014-05-25 04:09:43.193  INFO 59755 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
2014-05-25 04:09:43.250  WARN 59755 --- [           main] o.h.e.jdbc.internal.JdbcServicesImpl     : HHH000342: Could not obtain connection to query metadata : Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2014-05-25 04:09:43.263  INFO 59755 --- [           main] o.Apache.catalina.core.StandardService   : Stopping service Tomcat

Error starting ApplicationContext. To display the auto-configuration report enabled debug logging (start with --debug)


Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:195)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.Java:973)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:750)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:120)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:648)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:311)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:909)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:898)
    at admin.Application.main(Application.Java:36)
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.Java:104)
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.Java:71)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.Java:205)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.Java:89)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.Java:206)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.Java:178)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.Java:1885)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1843)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.Java:850)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.Java:843)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.Java:399)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.Java:842)
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.Java:150)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.Java:336)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.Java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1612)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1549)
    ... 15 more

application.yml:

spring:   
  jpa:
show-sql: true
hibernate:
  ddl-auto: none
  naming_strategy: org.hibernate.cfg.DefaultNamingStrategy
  temp:
    use_jdbc_metadata_defaults: false
27
Ripu Daman

C'était en effet un écrou difficile à casser.

Après beaucoup de recherches et de débogage du Spring-Boot, Spring, Hibernate, Tomcat Pool, etc. pour le faire.

Je pense que cela fera gagner beaucoup de temps aux personnes qui essaient d'atteindre ce type d'exigence.

Voici les paramètres requis pour atteindre l'exigence suivante

  1. Les applications de démarrage de printemps démarreront bien même si la base de données est en panne ou s'il n'y a pas de base de données.
  2. Les applications récupèrent les connexions à la volée lorsque la base de données apparaît, ce qui signifie qu'il n'est pas nécessaire de redémarrer le serveur Web ou de redéployer les applications.
  3. Il n'est pas nécessaire de démarrer le Tomcat ou de redéployer les applications, si DB descend de son état d'exécution et revient.

application.yml:

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/schema
    username: root
    password: root
    continueOnError: true
    initialize: false
    initialSize: 0
    timeBetweenEvictionRunsMillis: 5000
    minEvictableIdleTimeMillis: 5000
    minIdle: 0

  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none
      naming_strategy: org.hibernate.cfg.DefaultNamingStrategy
    properties:
      hibernate:   
        dialect: org.hibernate.dialect.MySQL5Dialect
        hbm2ddl:
          auto: none
        temp:
          use_jdbc_metadata_defaults: false
50
Ripu Daman

Je réponds ici et fermerai le problème que vous avez posté

Toute propriété "native" de l'implémentation JPA (Hibernate) peut être définie à l'aide de spring.jpa.properties préfixe comme expliqué ici

Je n'ai pas cherché beaucoup plus loin dans le problème réel ici, mais pour répondre à cette question particulière, vous pouvez définir cette clé de mise en veille prolongée comme suit

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults
9
Stephane Nicoll

L'ajout de cela seul a fonctionné pour moi:

spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.Oracle10gDialect

Remplacez simplement la dernière partie par votre dialecte de base de données.

6
Percy Vega