2015-09-28 16 views
6

Sto provando a creare un progetto "Spring-Boot" in cui ho un requisito in cui desidero connettermi a diversi database "MySql" e "MongoDB".In Spring-Boot, come possiamo connetterci a due database (database Mysql e MongoDB) nello stesso progetto?

Ho bisogno di fare qualcosa di speciale per connettersi a entrambi i database o il boot di primavera si calcola automaticamente per collegarsi a entrambi i database da solo. Devo definire anche l'origine dati per "mongodb"?

file di

MySQL specifico "YML" è come sotto

# 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 

mio MongoDB "YML" si presenta come di seguito

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

file di Application.java sotto

@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

Beh, non è chiaro quale sia la tua domanda? Per collegare i database hai dato tutto il necessario. Stai ancora chiedendo come leggere/scrivere da/su quale database? Questo dipende dal modello che stai seguendo. Se si utilizzano i repository, ciò è definito dall'interfaccia padre che si sta utilizzando per l'ereditarietà, 'JpaRepository' o' MongoRepository'. –

+0

Stai dicendo che l'avvio di Spring passerà automaticamente da mongoDb a mysql sulla base del repository come JpaRepository o MongoRepository? Non ho bisogno di fare qualcosa in più? –

+0

Sì, questo accade automaticamente e No non devi aggiungere altro se vai così. –

risposta

5

Non ci sono state domande in questo forum che parla della connessione dei due diversi database (database Mysql e MongoDB) nello stesso progetto di avvio a molla.

Ho fatto il lavoro per farlo quindi lo sto postando come risposta qui.

Utilizzare le configurazioni indicate di seguito ei repository come, JpaRepository o MongoRepository, a seconda del repository specifico del DB.

file di

MySQL specifico "YML" è come sotto

# 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 

mio MongoDB "YML" si presenta come di seguito

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

file di Application.java sotto

@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

Per me ciò che ha fatto la differenza è stato il metodo 'primaryDatasource' con le annotazioni corrispondenti –

Problemi correlati