2014-05-24 13 views
21

Sto usando "Spring-boot + Hibernate4 + mysql" per la mia applicazione. Come parte di cui ho un requisito in cui la mia app sprint-boot dovrebbe essere in grado di avviarsi anche quando il database non funziona. Attualmente fornisce l'eccezione qui sotto quando provo ad avviare la mia app di avvio di primavera senza che DB sia attivo.Come avviare l'app Spring-Boot senza dipendere dal Database?

Ho studiato molto e ho scoperto che questa eccezione ha a che fare con la proprietà hibernate.temp.use_jdbc_metadata_defaults.

Ho provato a impostare questo in "application.yml" di avvio di primavera, ma il valore di questa proprietà non viene riflessa in fase di esecuzione.

Eccezione dello stack:

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 

risposta

44

È stato davvero un osso duro .

Dopo molte ricerche e in realtà eseguire il debug di spring-boot, spring, hibernate, tomcat pool, ecc. Per farlo.

Penso che risparmierà molto tempo per le persone che cercano di raggiungere questo tipo di esigenza.

Qui di seguito sono le impostazioni necessarie per raggiungere il seguente requisito

  1. applicazioni Stivale Primavera inizierà bene anche se DB non è attivo o non c'è DB.
  2. Le app prelevano le connessioni al volo non appena DB viene visualizzato, il che significa che non è necessario riavviare il server Web o ridistribuire le app.
  3. Non è necessario avviare il tomcat o ridistribuire le app, se DB scende dallo stato di esecuzione e si riavvia.

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

Questo mi ha davvero risparmiato molto tempo. Grazie compagno. –

+0

Grazie per il codice. Ho dovuto fare lo stesso con EclipseLink, e tutto ciò che è servito per farlo era '' in 'persistence.xml'. – mdrg

10

sto rispondendo qui e chiuderò the issue that you have cross-posted

Qualsiasi proprietà "nativo" dell'APP implementazione (Hibernate) può essere impostata usando spring.jpa.properties prefisso explained here

non ho guardato molto più in là nel numero effettivo qui, ma per rispondere a questa particolare domanda, è possibile impostare la chiave di sospensione come segue

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults 
+1

Grazie. Risolve il problema di impostare la proprietà "use_jdbc_metadata_defaults".Ma se vedi il mio post, il vero problema era "l'avvio dell'app sprint-boot dovrebbe essere in grado di avviarsi anche quando il database è inattivo", cosa che non è risolta semplicemente impostando questo. –

+0

Giusto per essere chiari, questo non ha nulla a che fare con l'avvio Spring. Boot solo ti dà un meccanismo per configurare l'infrastruttura di ibernazione sottostante e avresti lo stesso identico problema se lo hai configurato tu stesso (cioè manualmente). Grazie per aver condiviso la configurazione! –

6

L'aggiunta di questo da solo ha lavorato per me:

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

Basta sostituire l'ultima parte con il dialetto del database.

-1

Add seguente configurazione dovrebbe essere il lavoro:

spring.jpa.database-platform: org.hibernate.dialect.MySQL5Dialect