2014-05-24 16 views
21

Używam "Spring-boot + Hibernate4 + mysql" dla mojej aplikacji. W ramach tego mam wymaganie, w którym moja aplikacja do sprintu rozruchowego powinna być uruchomiona nawet wtedy, gdy baza danych jest wyłączona. Obecnie daje poniżej wyjątek, gdy próbuję uruchomić moją aplikację rozruchu wiosna bez DB jest w górę.Jak uruchomić aplikację Spring-Boot bez zależności od bazy danych?

Zrobiłem wiele badań i okazało się, że ten wyjątek ma związek z własnością hibernate.temp.use_jdbc_metadata_defaults.

Próbowałem ustawić to w "application.yml" rozruchu wiosennego, ale wartość tej właściwości nie jest odzwierciedlana w środowisku wykonawczym.

śladu stosu wyjątku:

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 

Odpowiedz

44

To rzeczywiście trudny orzech do zgryzienia .

Po wielu badaniach i debugowaniu wiosny, rozruchu, hibernacji, puli tomcat itp., Aby to zrobić.

Sądzę, że zaoszczędzi to wiele czasu ludziom, którzy próbują osiągnąć ten typ wymagań.

Poniżej są ustawienia niezbędne, aby osiągnąć następujące wymaganie

  1. Wiosna startowych aplikacji rozpocznie grzywny, nawet jeśli DB jest wyłączony lub nie ma DB.
  2. Aplikacje będą pobierać połączenia w locie, gdy pojawi się DB, co oznacza, że ​​nie ma potrzeby restartowania serwera lub ponownego wdrażania aplikacji.
  3. Nie ma potrzeby uruchamiania tomcat lub ponownego wdrażania aplikacji, jeśli DB przestanie działać i pojawi się ponownie.

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

Ten naprawdę zaoszczędził wiele czasu dla mnie. Dzięki stary. –

+0

Dzięki za kod. Musiałem zrobić to samo z EclipseLink, a wszystko, co trzeba było zrobić, to '' in 'persistence.xml'. – mdrg

10

ja odpowiadam tutaj i zamknie the issue that you have cross-posted

Wszelkie "native" własność WZP implementację (Hibernate) można ustawić za pomocą spring.jpa.properties prefiks jak explained here

Nie wyglądał znacznie dalej w kwestii rzeczywistej tu jednak odpowiedzieć na to konkretne pytanie, można ustawić ten klucz hibernacji następująco

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

Dzięki. Naprawia problem z ustawieniem właściwości "use_jdbc_metadata_defaults".Ale jeśli widzisz mój post, to faktyczny problem brzmiał: "Uruchomienie sprint-bootowej aplikacji powinno być możliwe, nawet jeśli baza danych jest wyłączona", której nie można rozwiązać, po prostu ustawiając tę ​​opcję. –

+0

Dla jasności, nie ma to nic wspólnego z wiosennym startem. Boot zapewnia tylko mechanizm do skonfigurowania bazowej infrastruktury hibernacji i miałbyś ten sam problem, gdybyś sam to skonfigurował (tj. Ręcznie). Dzięki za udostępnienie konfiguracji! –

6

Dodawanie ten sam pracował dla mnie:

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

Wystarczy zastąpić ostatnią część ze swoim dialekcie bazy danych.

-1

Dodaj następujący config powinna być praca:

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

Powiązane problemy