Nous utilisons plusieurs configurations de sources de données dans notre application Spring Boot. les deux sources de données appartiennent uniquement à mysql.
Plusieurs sources de données configurées à l'aide de:
Modifications de pom.xml:
@Bean @ConfigurationProperties(prefix = "spring.db1.datasource") public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.db2.datasource") public DataSource db2Source() { return DataSourceBuilder.create().build(); }
.properties: strong >
spring.db1.datasource.jdbcUrl=jdbc:mysql://localhost:3306/db1?zeroDateTimeBehavior=convertToNull spring.db1.datasource.driverClassName=com.mysql.jdbc.Driver spring.db1.datasource.username=root spring.db1.datasource.password= spring.db1.datasource.hikari.maximum-pool-size=5 spring.db1.datasource.hikari.minimum-idle=1 spring.db2.datasource.jdbcUrl=jdbc:mysql://localhost:3306/db2?zeroDateTimeBehavior=convertToNull spring.db2.datasource.driverClassName=com.mysql.jdbc.Driver spring.db2.datasource.username=root spring.db2.datasource.password= spring.db2.datasource.hikari.maximum-pool-size=5 spring.db2.datasource.hikari.minimum-idle=1
Configuration du bean de source de données:
<!-- exclude tomcat jdbc connection pool, use HikariCP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency> <!-- exclude tomcat-jdbc, Spring Boot will use HikariCP automatically --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency>
Lorsque je lance l'application, sa création 10 connexions de db1 (@Primary datasource) par défaut mais cela ne prend pas en compte les propriétés maximum-pool-size et minimum-idle. De plus, il ne crée pas de connexions pour db2.
Y a-t-il une configuration manquée? s'il vous plaît aider
3 Réponses :
Assurez-vous d'avoir @Primary
spring.db1.datasource.jdbcUrl=jdbc:mysql://localhost:3306/db1?zeroDateTimeBehavior=convertToNull spring.db1.datasource.username=root spring.db1.datasource.password= spring.db1.datasource.maximum-pool-size=5 spring.db1.datasource.minimumIdle=1 spring.db2.datasource.jdbcUrl=jdbc:mysql://localhost:3306/db2?zeroDateTimeBehavior=convertToNull spring.db2.datasource.username=root spring.db2.datasource.password= spring.db2.datasource.maximum-pool-size=5 spring.db2.datasource.minimumIdle=1
Selon https://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html vous pouvez définir les propriétés comme suit
@Primary @Bean @ConfigurationProperties(prefix = "spring.db1.datasource") public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.db2.datasource") public DataSource db2Source() { return DataSourceBuilder.create().build(); }
En utilisant également DataSourceBuilder, vous pouvez détecter automatiquement la base du pilote sur la chaîne de connexion.
Vous pouvez définir logging.level.com.zaxxer.hikari.HikariConfig = TRACE
pour voir que vos propriétés de connexion fonctionnent.
Oui j'ai déjà mentionné @Primary mais ne fonctionne pas. Et les propriétés que vous avez données sont pour la version actuelle et non pour la version 1.5.18
Je ne vois aucune instruction de journal au niveau TRACE dans HikariConfig . Mais DEBUG devrait être suffisant pour enregistrer les propriétés de configuration.
Regardez ceci ma solution: https://github.com/dijalmasilva/ spring-boot-multitenancy-datasource-liquibase
Avec cette solution, vous pouvez ajouter plus de sources de données plus tard sans avoir à changer le code!
J'ai eu un problème similaire où la base de données non principale ne se connectait pas.
Enfin, j'ai fait les modifications ci-dessous et cela a fonctionné- Vous pouvez définir la taille de votre piscine et d'autres paramètres sous DataSourceProperties pour une configuration de base de données spécifique.
Tout d'abord, veuillez vérifier la structure de votre package-
com.example.product.entity.db1
com.example.product.entity .db2
com.example.product.repository.db1
com.example.product.repository.db2
com.example.product.configuration p>
DB1Configuration
DB2Configuration
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "db1EntityManagerFactory", transactionManagerRef="db1TransactionManager", basePackages="com.example.product.repository.db1" ) public class DB1Configuration { @Bean(name = "db1DataSourceProperties") @Primary @ConfigurationProperties("spring.datasource") public DataSourceProperties db1DataSourceProperties() { return new DataSourceProperties(); } @Primary @Bean(name = "db1DataSource") public DataSource db1DataSource() { return db1DataSourceProperties(). initializeDataSourceBuilder(). type(HikariDataSource.class).build(); } @Primary @Bean(name = "db1EntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("db1DataSource")DataSource dataSource){ return builder.dataSource(dataSource) .packages("com.example.product.entity.db1"). persistenceUnit("db1").build(); } @Primary @Bean(name="db1TransactionManager") public PlatformTransactionManager reconTransactionManager(@Qualifier("db1EntityManagerFactory")EntityManagerFactory reconEntityManagerFactory) { return new JpaTransactionManager(db1EntityManagerFactory); } } import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder.Builder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "db2EntityManagerFactory", transactionManagerRef ="db2TransactionManager", basePackages={"com.exmaple.product.repository.db2"} ) public class DB2Configuration { @Bean(name = "db2DataSourceProperties") @ConfigurationProperties("db2.datasource") public DataSourceProperties db2DataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "db2DataSource") public DataSource db2DataSource() { return db2DataSourceProperties(). initializeDataSourceBuilder(). type(BasicDataSource.class).build(); } @Bean(name = "db2EntityManagerFactory") public LocalContainerEntityManagerFactoryBean itmsEntityManagerFactory(final EntityManagerFactoryBuilder builder) { Builder dataSource = builder.dataSource(db2DataSource()); return dataSource. packages("com.example.product.entity.db2").persistenceUnit("db2").build(); } @Bean(name = "db2TransactionManager") public PlatformTransactionManager itmsTransactionManager(@Qualifier("db2EntityManagerFactory")EntityManagerFactory db2EntityManagerFactory) { return new JpaTransactionManager(db2EntityManagerFactory); } } application.properties spring.datasource.driver = com.mysql.cj.jdbc.Driver spring.datasource.url= jdbc:mysql://localhost:3306/db1 spring.datasource.username=root spring.datasource.password=root db2.datasource.driver=com.mysql.cj.jdbc.Driver db2.datasource.url=jdbc:mysql://localhost:3306/db2 db2.datasource.username=root db2.datasource.password=root