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 diMySQL 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);
}
}
}
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'. –
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ù? –
Sì, questo accade automaticamente e No non devi aggiungere altro se vai così. –