web-dev-qa-db-ja.com

データベースに依存せずにスプリングブートアプリを起動する方法

アプリケーションに「Spring-boot + Hibernate4 + mysql」を使用しています。その一環として、データベースがダウンしている場合でも、sprint-bootアプリを起動できるようにする必要があります。現在、DBを起動せずにスプリングブートアプリを起動しようとすると、以下の例外が発生します。

私はよく調べて、この例外が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
27
Ripu Daman

それは確かに割れるのが難しいナットでした。

多くの研究を重ね、実際にspring-boot、spring、hibernate、Tomcatプールなどをデバッグして完了させました。

このタイプの要件を達成しようとする人々にとって、多くの時間を節約できると思います。

以下は、次の要件を満たすために必要な設定です。

  1. DBがダウンしているか、DBがない場合でも、Springブートアプリは正常に起動します。
  2. DBが起動すると、アプリはその場で接続を取得します。つまり、Webサーバーを再起動したり、アプリを再デプロイしたりする必要はありません。
  3. DBが実行状態からダウンして再度アップした場合、Tomcatを起動したり、アプリを再デプロイしたりする必要はありません。

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

私はここで答えていると閉じます あなたがクロスポストした問題

JPA実装(Hibernate)の「ネイティブ」プロパティは、spring.jpa.propertiesプレフィックスを ここで説明 として使用して設定できます。

ここでは実際の問題を詳しく調べていませんが、この特定の質問に答えるために、次のように休止状態キーを設定できます

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

これを追加するだけでうまくいきました:

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

最後の部分をデータベースの方言に置き換えるだけです。

6
Percy Vega