2
votes

Les propriétés Hikari CP ne fonctionnent pas avec la configuration de sources de données multiples dans Spring 1.5.18

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:

https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring- data-6430b00c02e7

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


0 commentaires

3 Réponses :


2
votes

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.


2 commentaires

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.



0
votes

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!


0 commentaires

0
votes

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



0 commentaires