2016-06-21 7 views
0

私はスプリングブートアプリケーションで複数のデータソースを持っています。私のアプリケーションは、その後フライウェイはスプリングブートでデータソースを見つけることができませんでしたマルチデータソースアプリケーション

spring: 
    profiles: default 
    datasource: 
    url: jdbc:postgresql://${pr.db.host}:${pr.db.port}/${pr.db.name} 
    username: ${pr.db.user} 
    password: ${pr.db.password} 
    driverClassName: org.postgresql.Driver 
    test-on-borrow: true 
    test-while-idle: true 
    validation-query: select 1; 
    maxActive: 1 
    jpa: 
    show-sql: false 
    generate-ddl: false 
    properties: 
     hibernate: 
     dialect: org.hibernate.dialect.PostgreSQLDialect 
     ddl-auto: validate 
     hbm2ddl: 
      import_files: 

otherdb: 
    datasource: 
    url: jdbc:postgresql://${pf.db.host}:${pf.db.port}/${pf.db.name} 
    username: ${pf.db.user} 
    password: ${pf.db.password} 
    driverClassName: org.postgresql.Driver 
    test-on-borrow: true 
    test-while-idle: true 
    validation-query: select 1; 
    maxActive: 1 

として構成され、私は私のcom.company.project.dbconfigパッケージに二つのクラスDBOneConfigOtherDBConfigを作成しました。

私はあなたが必要とするプロジェクト、私は例外を以下の取得

[2016-06-20 21:38:56.196] [main] ERROR o.s.boot.SpringApplication - Application startup failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) 
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) 
    at com.worldgaming.pennyrama.Application.main(Application.java:12) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: org.flywaydb.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource 
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56) 
    at org.flywaydb.core.Flyway.execute(Flyway.java:1386) 
    at org.flywaydb.core.Flyway.migrate(Flyway.java:1006) 
    at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    ... 23 common frames omitted 
Caused by: org.apache.tomcat.jdbc.pool.PoolExhaustedException: [main] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:1; busy:1; idle:0; lastwait:30000]. 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:681) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:185) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:127) 
    at org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50) 
    ... 28 common frames omitted 
+2

再びエラーメッセージをお読みください。データソースは見つかって使用されていますが、プール内で利用可能な接続は1つしかなく、既に使用されています。 '30秒で接続を取得できません。ビジー:1;アイドル:0; lastwait:30000]。 –

+0

ありがとうございます。私はそれを考え出した。 –

答えて

0

注意を実行するとDBOneConfigは、この(私はすでにFlywayDataSourceとしてそれをマークしていることに注意してください)今

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
    entityManagerFactoryRef = "entityManagerFactory", 
    basePackages = {"com.company.project.repo"} 
) 
public class DbOneConfig { 
    @Primary 
    @Bean(name = "dataSource") 
    @FlywayDataSource 
    @ConfigurationProperties(prefix="spring.datasource") 
    public DataSource dataSource() { 
    DataSource dataSource = DataSourceBuilder.create().build(); 
    return dataSource; 
    } 

    @Primary 
    @Bean(name = "entityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    EntityManagerFactoryBuilder builder, 
    @Qualifier("dataSource") DataSource dataSource) { 
    return builder 
     .dataSource(dataSource) 
     .packages("com.worldgaming.pennyrama.domain") 
     .persistenceUnit("pennyrama") 
     .build(); 
    } 

    @Primary 
    @Bean(name = "transactionManager") 
    public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) { 
    return new JpaTransactionManager(entityManagerFactory); 
    } 
} 

のように見えます各データ・アーカスに対して2つの異なるクラスを持つようにします。それぞれは、リポジトリフォルダとそのエンティティの設定も参照する必要があります。このようにして、使用すると、どのデータソースが使用されているかがわかります。通常

、あなたが使用する必要があり、下線するキャメルケースに変換されませんハイバネートマルチデータソースを使用します。

@Table(name = "investor_destination") 
@Column(name = "dest_type") 
関連する問題