2015-09-28 9 views
6

Próbuję utworzyć projekt "Spring-Boot", w którym mam wymaganie, w którym chcę się połączyć z różnymi bazami danych "MySql" i "MongoDB".W Spring-Boot, Jak połączyć się z dwiema bazami danych (baza danych Mysql i MongoDB) w tym samym projekcie?

Czy muszę zrobić coś specjalnego, aby połączyć się z obydwoma bazami danych lub wiosenny rozruch wykryje automatycznie, aby połączyć się z obydwoma bazami danych samodzielnie. Czy muszę również zdefiniować źródło danych dla "mongodb"?

MySQL specyficzny "yml" Plik jest jak poniżej

# 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 

My MongoDB "yml" wygląda jak poniżej

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

plik Application.java poniżej

@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); 
    } 
    } 
} 
+0

Cóż, nie jest jasne, jakie jest twoje pytanie? Do łączenia baz danych dałeś wszystko, co konieczne. Czy zastanawiasz się więcej jak czytać/pisać z/do której bazy danych? Jest to zależne od modelu, który obserwujesz. Jeśli używasz repozytoriów, jest to zdefiniowane przez interfejs nadrzędny, którego używasz do dziedziczenia, 'JpaRepository' lub' MongoRepository'. –

+0

Czy mówisz, że Spring boot automatycznie przełącza się pomiędzy mongoDb i mysql na podstawie repozytorium takiego jak JpaRepository lub MongoRepository? Czy nie muszę robić nic więcej? –

+0

Tak, dzieje się to automatycznie i nie, nie musisz dodawać niczego więcej, jeśli pójdziesz tą drogą. –

Odpowiedz

5

Na tym forum nie było żadnych pytań, które mówią o połączeniu dwóch różnych baz danych (baza danych Mysql i MongoDB) w tym samym projekcie wiosennego rozruchu.

Zrobiłem to, aby to zrobić, dlatego zamieszczam tutaj odpowiedź.

Użyj poniżej podanych konfiguracji i repozytoriów jako JpaRepository lub MongoRepository, w zależności od danego repozytorium DB.

MySQL specyficzny "yml" Plik jest jak poniżej

# 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 

My MongoDB "yml" wygląda jak poniżej

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

plik Application.java poniżej

@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); 
    } 
    } 
} 
+0

Dla mnie różnica polega na metodzie "primaryDatasource' z odpowiednimi adnotacjami –

Powiązane problemy