Spring Boot'ta Çoklu Veritabanı Konfigürasyonu: İki Farklı İlişkisel Veritabanı ile Spring Data JPA Kullanımı"





Spring Boot projenizde iki farklı ilişkisel veritabanı kullanıyorsanız, her bir veritabanı için ayrı bir DataSource, EntityManagerFactory ve TransactionManager konfigürasyonuna ihtiyacınız olacak. Bu, Spring Boot'un her bir veritabanı için ayrı veri kaynaklarıyla çalışabilmesini sağlar. Aşağıda, bu konfigürasyonları nasıl yapabileceğinize dair genel bir rehber bulunmaktadır:


1. application.properties veya application.yml Dosyasında Veritabanı Ayarlarını Tanımlayın

İki veritabanı için gerekli olan ayarları application.properties veya application.yml dosyanıza ekleyin. Örneğin:


properties

Copy code

# Veritabanı 1

spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1

spring.datasource.db1.username=root

spring.datasource.db1.password=pass

spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver


# Veritabanı 2

spring.datasource.db2.url=jdbc:postgresql://localhost:5432/db2

spring.datasource.db2.username=root

spring.datasource.db2.password=pass

spring.datasource.db2.driver-class-name=org.postgresql.Driver

2. DataSource Bean'lerini Oluşturun

Her bir veritabanı için ayrı DataSource bean'leri tanımlayın. Bunun için @Configuration sınıfları kullanabilirsiniz:


java

Copy code

@Configuration

public class Db1Config {


    @Bean

    @Primary

    @ConfigurationProperties(prefix="spring.datasource.db1")

    public DataSource db1DataSource() {

        return DataSourceBuilder.create().build();

    }

}


@Configuration

public class Db2Config {


    @Bean

    @ConfigurationProperties(prefix="spring.datasource.db2")

    public DataSource db2DataSource() {

        return DataSourceBuilder.create().build();

    }

}

3. EntityManagerFactory ve TransactionManager Ayarlayın

Her veritabanı için ayrı EntityManagerFactory ve TransactionManager bean'leri oluşturun:


java

Copy code

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(

  entityManagerFactoryRef = "db1EntityManagerFactory",

  transactionManagerRef = "db1TransactionManager",

  basePackages = { "com.yourpackage.db1.repository" }

)

public class Db1Config {


    @Primary

    @Bean(name = "db1EntityManagerFactory")

    public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(

            EntityManagerFactoryBuilder builder, @Qualifier("db1DataSource") DataSource dataSource) {

        return builder

                .dataSource(dataSource)

                .packages("com.yourpackage.db1.model")

                .persistenceUnit("db1")

                .build();

    }


    @Primary

    @Bean(name = "db1TransactionManager")

    public PlatformTransactionManager db1TransactionManager(

            @Qualifier("db1EntityManagerFactory") EntityManagerFactory db1EntityManagerFactory) {

        return new JpaTransactionManager(db1EntityManagerFactory);

    }

}


@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(

  entityManagerFactoryRef = "db2EntityManagerFactory",

  transactionManagerRef = "db2TransactionManager",

  basePackages = { "com.yourpackage.db2.repository" }

)

public class Db2Config {


    @Bean(name = "db2EntityManagerFactory")

    public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(

            EntityManagerFactoryBuilder builder, @Qualifier("db2DataSource") DataSource dataSource) {

        return builder

                .dataSource(dataSource)

                .packages("com.yourpackage.db2.model")

                .persistenceUnit("db2")

                .build();

    }


    @Bean(name = "db2TransactionManager")

    public PlatformTransactionManager db2TransactionManager(

            @Qualifier("db2EntityManagerFactory") EntityManagerFactory db2EntityManagerFactory) {

        return new JpaTransactionManager(db2EntityManagerFactory);

    }

}

Bu kod parçaları, iki farklı veritabanı kaynağını ve bunlarla ilişkili JPA yapılandırmalarını tanımlar. Burada önemli noktalar:


Her bir veritabanı için ayrı bir DataSource bean'i tanımlanmıştır.

@EnableJpaRepositories ile hangi paketin hangi EntityManagerFactory ve TransactionManager ile ilişkilendirileceği belirtilmiştir.

@Primary anotasyonu, eğer birden fazla bean tanımlıysa ve biri otomatik olarak enjekte edilmek isteniyorsise, Spring'in hangi bean'i kullanması gerektiğini belirtir. Genellikle ana veritabanınız için kullanılır.


4. Repository Sınıflarını Tanımlayın

Her bir veritabanı için ayrı repository sınıfları oluşturun ve bunları ilgili @EnableJpaRepositories ile tanımladığınız basePackages içinde yerleştirin. Bu, Spring Data JPA'nın her bir veritabanı için ayrı DAO'lar (Data Access Objects) kullanmasını sağlar.


Örnek olarak, db1 veritabanı için bir repository:


java

Copy code

package com.yourpackage.db1.repository;


import com.yourpackage.db1.model.YourEntity;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.stereotype.Repository;


@Repository

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {

    // db1 ile ilgili sorgularınızı buraya ekleyin

}

Ve db2 için başka bir repository:


java

Copy code

package com.yourpackage.db2.repository;


import com.yourpackage.db2.model.AnotherEntity;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.stereotype.Repository;


@Repository

public interface AnotherEntityRepository extends JpaRepository<AnotherEntity, Long> {

    // db2 ile ilgili sorgularınızı buraya ekleyin

}

5. İşlem Yaparken Hangi Transaction Manager'ın Kullanılacağını Belirtin

Birden fazla TransactionManager kullanıyorsanız, işlem yaparken hangisinin kullanılacağını @Transactional anotasyonunda belirtmeniz gerekir. Örneğin:


java

Copy code

@Service

public class YourService {


    private final YourEntityRepository yourEntityRepository;


    @Autowired

    public YourService(YourEntityRepository yourEntityRepository) {

        this.yourEntityRepository = yourEntityRepository;

    }


    @Transactional("db1TransactionManager")

    public void doSomethingWithDb1() {

        // db1 ile ilgili işlemler

    }

}

Ve db2 için:


java

Copy code

@Service

public class AnotherService {


    private final AnotherEntityRepository anotherEntityRepository;


    @Autowired

    public AnotherService(AnotherEntityRepository anotherEntityRepository) {

        this.anotherEntityRepository = anotherEntityRepository;

    }


    @Transactional("db2TransactionManager")

    public void doSomethingWithDb2() {

        // db2 ile ilgili işlemler

    }

}

Son Notlar

Bu yapılandırma, Spring Boot'un otomatik yapılandırma özelliklerini iki ayrı veritabanı için manuel olarak genişletmenizi sağlar.

Yapılandırmayı daha da özelleştirmeniz gerekiyorsa, Spring'in dokümantasyonundaki ilgili bölümlere başvurun.

Herhangi bir yapılandırma sırasında hata alırsanız, hataların ayrıntılı açıklamalarını ve nasıl çözüldüklerini içeren Spring Boot'un hata mesajlarını kontrol edin.

Bu rehber, iki ilişkisel veritabanını Spring Boot uygulamanıza entegre etmeniz için temel bir başlangıç noktası sağlamaktadır. Uygulamanızın özel gereksinimlerine göre bu yapılandırmayı uyarlamanız gerekebilir.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال