Как запустить приложение с весенней загрузкой, не завися от базы данных?

Я использую «Spring-boot + Hibernate4 + mysql» для своего приложения. В рамках этого у меня есть требование, согласно которому мое приложение sprint-boot должно иметь возможность запускаться, даже если база данных не работает. В настоящее время это дает приведенное ниже исключение, когда я пытаюсь запустить свое весеннее загрузочное приложение без работы БД.

Я много исследовал и выяснил, что это исключение связано со свойством hibernate.temp.use_jdbc_metadata_defaults.

Я попытался установить это в «application.yml» весенней загрузки, но значение этого свойства не отражается во время выполнения.

Трассировка стека исключений:

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

person Ripu Daman    schedule 24.05.2014    source источник


Ответы (5)


Это действительно был крепкий орешек.

После многих и многих исследований и фактической отладки весенней загрузки, весны, спящего режима, пула tomcat и т. д., чтобы сделать это.

Я действительно думаю, что это сэкономит много времени людям, пытающимся выполнить требования такого типа.

Ниже приведены настройки, необходимые для выполнения следующего требования.

  1. Приложения Spring boot запускаются нормально, даже если БД не работает или БД нет.
  2. Приложения будут подхватывать соединения на лету по мере появления БД, что означает, что нет необходимости перезапускать веб-сервер или повторно развертывать приложения.
  3. Нет необходимости запускать Tomcat или повторно развертывать приложения, если БД выходит из рабочего состояния и снова запускается.

приложение.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
person Ripu Daman    schedule 26.05.2014
comment
Это действительно сэкономило мне много времени. Спасибо друг. - person Shishir Kumar; 07.07.2015
comment
Спасибо за код. Мне пришлось сделать то же самое с EclipseLink, и все, что для этого потребовалось, это <property name="eclipselink.validation-only" value="true"/> в persistence.xml. - person mdrg; 15.01.2018
comment
упомянутые реквизиты теперь устарели. @ripu ты знаешь, что такое новые свойства? - person Vinay Prajapati; 07.03.2019
comment
Единственная настройка, которая мне была нужна, это spring.jpa.database-platform. - person pacoverflow; 20.02.2020

Я отвечу здесь и закрою проблему, которую вы разместили перекрестно

Любое «родное» свойство реализации JPA (Hibernate) может быть установлено с использованием префикса spring.jpa.properties как объяснено здесь

Я не особо углублялся в актуальную проблему здесь, но чтобы ответить на этот конкретный вопрос, вы можете установить этот ключ гибернации следующим образом.

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults
person Stephane Nicoll    schedule 25.05.2014
comment
Спасибо. Он устраняет проблему установки свойства use_jdbc_metadata_defaults. Но если вы видите мой пост, фактическая проблема заключалась в том, что приложение sprint-boot должно иметь возможность запускаться, даже когда база данных не работает, что не решается простой установкой этого. - person Ripu Daman; 26.05.2014
comment
Просто чтобы было ясно, это не имеет ничего общего с загрузкой Spring. Загрузка дает вам только механизм для настройки базовой инфраструктуры гибернации, и у вас будет точно такая же проблема, если вы настроите ее самостоятельно (т.е. вручную). Спасибо, что поделились конфигом! - person Stephane Nicoll; 27.05.2014

Добавление только этого сработало для меня:

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

Просто замените последнюю часть диалектом вашей базы данных.

person Percy Vega    schedule 30.09.2014

Решение действительно полезно для меня. Спасибо, я использовал файл «application.properties», включающий следующие строки:

    app.sqlhost=192.168.10.11
    app.sqlport=3306
    app.sqldatabase=logs

    spring.main.web-application-type=none

    # Datasource
    spring.datasource.url=jdbc:mysql://${app.sqlhost}:${app.sqlport}/${app.sqldatabase}
    spring.datasource.username=user
    spring.datasource.password=password
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    spring.jpa.properties.hibernate.hbm2dll.auto = none
    spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false

    spring.datasource.continue-on-error=true
    spring.datasource.initialization-mode=never

    spring.datasource.hikari.connection-timeout=5000
    spring.datasource.hikari.idle-timeout=600000
    spring.datasource.hikari.max-lifetime=1800000
    spring.datasource.hikari.initialization-fail-timeout= -1

    spring.jpa.hibernate.use-new-id-generator-mappings=true
    spring.jpa.hibernate.ddl-auto=none

    spring.jpa.show-sql=true

    spring.output.ansi.enabled=always

Но вы не можете использовать аннотацию @Transactional на уровне класса

@Service
//@Transactional  //do not use to touch the Repository
@EnableAsync
@Scope( proxyMode = ScopedProxyMode.TARGET_CLASS )
public class LogService {
.... }

@Async
@Transactional  // you can use at function level
public void deleteLogs(){
    logRepository.deleteAllBy ...
}
person selami tastan    schedule 19.03.2020

Добавьте следующую конфигурацию, которая должна работать:

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

person vr3C    schedule 09.03.2015