2015-09-28 4 views
6

私は別のデータベース "MySql"と "MongoDB"に接続する必要がある "Spring-Boot"プロジェクトを作成しようとしています。Spring-Bootでは、同じプロジェクト内の2つのデータベース(MysqlデータベースとMongoDB)にどのように接続できますか?

両方のデータベースに接続するために特別な処理を行う必要がありますか、または両方のデータベースに自動的に接続するように自動的に判断されます。私は "mongodb"のデータソースも定義する必要がありますか?

# Default DB parameter definitions for the URL parameters in the spring.datasource.url property below 
database: 
    host: localhost 
    port: 3306 
    schema: subscriptions 
    username: root 
    password: root 
    autoconnect: 
    maxReconnects: 3 
    initialTimeout: 2 
    timeout: 
    connectTimeout: 0 
    socketTimeout: 0 
    failover: 
    host: localhost 
    port: 3306 
    queriesBeforeRetryMaster: 50 
    secondsBeforeRetryMaster: 30 
    properties: useTimezone=true&serverTimezone=UTC&useLegacyDatetimeCode=false&failOverReadOnly=false&autoReconnect=true&maxReconnects=${database.autoconnect.maxReconnects}&initialTimeout=${database.autoconnect.initialTimeout}&connectTimeout=${database.timeout.connectTimeout}&socketTimeout=${database.timeout.socketTimeout}&queriesBeforeRetryMaster=${database.failover.queriesBeforeRetryMaster}&secondsBeforeRetryMaster=${database.failover.secondsBeforeRetryMaster} 

spring: 
    datasource: 
    driverClassName: com.mysql.jdbc.Driver 
    url: jdbc:mysql://${database.host}:${database.port},${database.failover.host}:${database.failover.port}/${database.schema}?${database.properties} 
    username: ${database.username} 
    password: ${database.password} 
    continueOnError: true 
    initialize: false 
    initialSize: 0 
    timeBetweenEvictionRunsMillis: 5000 
    minEvictableIdleTimeMillis: 5000 
    removeAbandonedTimeout: 60 
    removeAbandoned: true 
    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 

マイMongoDBの "YML" の下には、以下の

spring: 
    data: 
    mongodb.host: localhost 
    mongodb.port: 27017 
    mongodb.database: eventsarchive 
    mongodb.username: root 
    mongodb.password: root 
    mongodb.repositories.enabled: true 

以下

Application.javaファイル

@Configuration 
@EnableAutoConfiguration 
@EnableConfigurationProperties 
@EntityScan(basePackages = { "persistence.mysql.domain" }) 
@EnableJpaRepositories("persistence.mysql.dao") 
@EnableMongoRepositories("persistence.mongodb.dao") 
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, 
value = ApiAuthenticationFilter.class) }, 
basePackages = { 
       "admin", 
       "common", 
       "mqclient", 
"scheduler" }) 
public class Application { 

    @Value("${service.name}") 
    private String serviceName; 
    @Value("${service.namespace}") 
    private String serviceNamespace; 
    @Value("${webservice.namespace}") 
    private String webserviceNamespace; 
    @Value("${webservice.port}") 
    private int webservicePort; 
    @Value("${jersey.request-filters}") 
    private String requestFilters; 
    @Value("${jersey.response-filters}") 
    private String responseFilters; 

    private static final String MAPPING_URL = "/%s/*"; 

    static { 
    System.setProperty(USER_TIMEZONE, "UTC"); 
    } 

    /** 
    * Java main method. 
    */ 
    public static void main(String[] args) { 
    /* 
    * Defines which Spring Boot Profiles should be active on startup. Please see 
    * http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-profiles for details. 
    */ 
    final SpringApplicationBuilder appBuilder = new SpringApplicationBuilder(Application.class); 
    appBuilder.profiles("common", "common_mongo_db", "common_mysql_db", "common_rabbitmq", "admin").application() 
    .run(args); 
    } 

    /** 
    * Registers Jersey with Spring Boot. 
    */ 
    @Bean 
    public ServletRegistrationBean registerJersey() { 
    final ServletRegistrationBean registration = new ServletRegistrationBean(new SpringServlet(), 
                      String.format(MAPPING_URL, 
                          this.serviceNamespace)); 

    registration.addInitParameter(JERSEY_MAPPING_FEATURE, Boolean.toString(true)); 
    registration.addInitParameter(PROPERTY_CONTAINER_REQUEST_FILTERS, this.requestFilters); 
    registration.addInitParameter(PROPERTY_CONTAINER_RESPONSE_FILTERS, this.responseFilters); 
    registration.addInitParameter(PROPERTY_RESOURCE_FILTER_FACTORIES, ValidationResourceFilterFactory.class.getName()); 

    return registration; 
    } 

    /** 
    * This method initializes SimpleHttpServerJaxWsServiceExporter bean which reads all @Webservice annotated components 
    * and hosts web service for them. 
    * 
    * @return SimpleHttpServerJaxWsServiceExporter 
    */ 
    @Bean 
    public SimpleHttpServerJaxWsServiceExporter exportJaxwsService() { 
    final SimpleHttpServerJaxWsServiceExporter jaxWsServiceExporter = new SimpleHttpServerJaxWsServiceExporter(); 
    jaxWsServiceExporter.setPort(this.webservicePort); 
    jaxWsServiceExporter.setBasePath("/" + this.serviceNamespace + "/" + this.webserviceNamespace + "/"); 
    return jaxWsServiceExporter; 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties(prefix = "spring.datasource") 
    public DataSource primaryDataSource() { 
    return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    public EmbeddedServletContainerFactory servletContainer() { 
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 
    factory.setTomcatContextCustomizers(Arrays.asList(new CustomCustomizer())); 
    return factory; 
    } 

    static class CustomCustomizer implements TomcatContextCustomizer { 

    @Override 
    public void customize(Context context) { 
     context.setUseHttpOnly(false); 
     context.setCookies(false); 
    } 
    } 
} 
のように見えるように

MySQLの特定の "YML" ファイルがあります

+0

あなたの質問は何ですか?必要なものすべてを与えたデータベースを接続するため。あなたはどのデータベースからどのように読み書きするかをもっと疑問に思っていますか?これはあなたがフォローしているモデルに依存しています。リポジトリを使用している場合、これは継承のために使用している親インタフェース(JpaRepositoryまたはMongoRepository)によって定義されます。 –

+0

JpaRepositoryやMongoRepositoryのようなリポジトリに基づいて、SpringブートがmongoDbとmysqlの間で自動的に切り替わると言っていますか?余分なことをする必要はありませんか? –

+0

はい、これは自動的に起こります。このようにすれば、何も追加する必要はありません。 –

答えて

5

このフォーラムでは、同じspring-bootプロジェクトの2つの異なるデータベース(MysqlデータベースとMongoDB)の接続に関する質問はありませんでした。

私はそれを行うための作業を行ったので、私はここに答えとしてそれを掲示しています。

特定のリポジトリが所属するDBに応じて、下記の設定とJpaRepositoryまたはMongoRepositoryのいずれかのリポジトリを使用します。

# Default DB parameter definitions for the URL parameters in the spring.datasource.url property below 
database: 
    host: localhost 
    port: 3306 
    schema: subscriptions 
    username: root 
    password: root 
    autoconnect: 
    maxReconnects: 3 
    initialTimeout: 2 
    timeout: 
    connectTimeout: 0 
    socketTimeout: 0 
    failover: 
    host: localhost 
    port: 3306 
    queriesBeforeRetryMaster: 50 
    secondsBeforeRetryMaster: 30 
    properties: useTimezone=true&serverTimezone=UTC&useLegacyDatetimeCode=false&failOverReadOnly=false&autoReconnect=true&maxReconnects=${database.autoconnect.maxReconnects}&initialTimeout=${database.autoconnect.initialTimeout}&connectTimeout=${database.timeout.connectTimeout}&socketTimeout=${database.timeout.socketTimeout}&queriesBeforeRetryMaster=${database.failover.queriesBeforeRetryMaster}&secondsBeforeRetryMaster=${database.failover.secondsBeforeRetryMaster} 

spring: 
    datasource: 
    driverClassName: com.mysql.jdbc.Driver 
    url: jdbc:mysql://${database.host}:${database.port},${database.failover.host}:${database.failover.port}/${database.schema}?${database.properties} 
    username: ${database.username} 
    password: ${database.password} 
    continueOnError: true 
    initialize: false 
    initialSize: 0 
    timeBetweenEvictionRunsMillis: 5000 
    minEvictableIdleTimeMillis: 5000 
    removeAbandonedTimeout: 60 
    removeAbandoned: true 
    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 

マイMongoDBの "YML" の下には、以下の

spring: 
    data: 
    mongodb.host: localhost 
    mongodb.port: 27017 
    mongodb.database: eventsarchive 
    mongodb.username: root 
    mongodb.password: root 
    mongodb.repositories.enabled: true 

以下

Application.javaファイル

@Configuration 
@EnableAutoConfiguration 
@EnableConfigurationProperties 
@EntityScan(basePackages = { "persistence.mysql.domain" }) 
@EnableJpaRepositories("persistence.mysql.dao") 
@EnableMongoRepositories("persistence.mongodb.dao") 
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, 
value = ApiAuthenticationFilter.class) }, 
basePackages = { 
       "admin", 
       "common", 
       "mqclient", 
"scheduler" }) 
public class Application { 

    @Value("${service.name}") 
    private String serviceName; 
    @Value("${service.namespace}") 
    private String serviceNamespace; 
    @Value("${webservice.namespace}") 
    private String webserviceNamespace; 
    @Value("${webservice.port}") 
    private int webservicePort; 
    @Value("${jersey.request-filters}") 
    private String requestFilters; 
    @Value("${jersey.response-filters}") 
    private String responseFilters; 

    private static final String MAPPING_URL = "/%s/*"; 

    static { 
    System.setProperty(USER_TIMEZONE, "UTC"); 
    } 

    /** 
    * Java main method. 
    */ 
    public static void main(String[] args) { 
    /* 
    * Defines which Spring Boot Profiles should be active on startup. Please see 
    * http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-profiles for details. 
    */ 
    final SpringApplicationBuilder appBuilder = new SpringApplicationBuilder(Application.class); 
    appBuilder.profiles("common", "common_mongo_db", "common_mysql_db", "common_rabbitmq", "admin").application() 
    .run(args); 
    } 

    /** 
    * Registers Jersey with Spring Boot. 
    */ 
    @Bean 
    public ServletRegistrationBean registerJersey() { 
    final ServletRegistrationBean registration = new ServletRegistrationBean(new SpringServlet(), 
                      String.format(MAPPING_URL, 
                          this.serviceNamespace)); 

    registration.addInitParameter(JERSEY_MAPPING_FEATURE, Boolean.toString(true)); 
    registration.addInitParameter(PROPERTY_CONTAINER_REQUEST_FILTERS, this.requestFilters); 
    registration.addInitParameter(PROPERTY_CONTAINER_RESPONSE_FILTERS, this.responseFilters); 
    registration.addInitParameter(PROPERTY_RESOURCE_FILTER_FACTORIES, ValidationResourceFilterFactory.class.getName()); 

    return registration; 
    } 

    /** 
    * This method initializes SimpleHttpServerJaxWsServiceExporter bean which reads all @Webservice annotated components 
    * and hosts web service for them. 
    * 
    * @return SimpleHttpServerJaxWsServiceExporter 
    */ 
    @Bean 
    public SimpleHttpServerJaxWsServiceExporter exportJaxwsService() { 
    final SimpleHttpServerJaxWsServiceExporter jaxWsServiceExporter = new SimpleHttpServerJaxWsServiceExporter(); 
    jaxWsServiceExporter.setPort(this.webservicePort); 
    jaxWsServiceExporter.setBasePath("/" + this.serviceNamespace + "/" + this.webserviceNamespace + "/"); 
    return jaxWsServiceExporter; 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties(prefix = "spring.datasource") 
    public DataSource primaryDataSource() { 
    return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    public EmbeddedServletContainerFactory servletContainer() { 
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 
    factory.setTomcatContextCustomizers(Arrays.asList(new CustomCustomizer())); 
    return factory; 
    } 

    static class CustomCustomizer implements TomcatContextCustomizer { 

    @Override 
    public void customize(Context context) { 
     context.setUseHttpOnly(false); 
     context.setCookies(false); 
    } 
    } 
} 
のように見えるように

MySQLの特定の "YML" ファイルがあります

+0

私にとっては違いは、対応する注釈を持つ 'primaryDatasource'メソッドでした –

関連する問題