Multiple DataSource এর ধারণা এবং প্রয়োজনীয়তা

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Multiple DataSource Configuration
257

Multiple DataSource কি?

Multiple DataSource হল একটি কনসেপ্ট যেখানে একাধিক ডাটাবেস (যেমন: MySQL, PostgreSQL, MongoDB ইত্যাদি) এক অ্যাপ্লিকেশনে ব্যবহার করা হয়। Spring Boot এর মাধ্যমে আপনি সহজেই একাধিক ডাটাবেসের সাথে যোগাযোগ করতে পারেন, একে বলা হয় Multiple DataSource Configuration

Spring Boot সাধারণত একটি ডাটাবেস কনফিগারেশন ধারণ করে, কিন্তু কখনো কখনো আমাদের প্রয়োজন হয় একাধিক ডাটাবেস ব্যবহারের, যেমন বিভিন্ন ডেটা ধরনের জন্য আলাদা ডাটাবেস (RDBMS এবং NoSQL), বা একটি অ্যাপ্লিকেশনে বিভিন্ন অঞ্চলের জন্য আলাদা ডাটাবেস ব্যবহার।

Spring Boot-এ Multiple DataSource কনফিগারেশন করার মাধ্যমে আপনি একাধিক ডাটাবেসের সাথে কাজ করতে পারবেন, এবং প্রতিটি ডাটাবেসের জন্য আলাদা EntityManager, TransactionManager, এবং DataSource তৈরি করা সম্ভব।


Multiple DataSource Configuration এর প্রয়োজনীয়তা

  1. ভিন্ন ভিন্ন ডেটা উৎসের ব্যবহারের প্রয়োজন: অনেক সময় বিভিন্ন ধরণের ডেটার জন্য আলাদা ডাটাবেস ব্যবহারের প্রয়োজন হয়। উদাহরণস্বরূপ, RDBMS এবং NoSQL ডাটাবেস একই অ্যাপ্লিকেশনে ব্যবহৃত হতে পারে।
  2. একাধিক ডাটাবেসে ডেটার পারফরম্যান্স অপটিমাইজেশন: কিছু নির্দিষ্ট ডেটা প্রয়োজনে RDBMS তে সংরক্ষণ করা যেতে পারে, আবার কিছু ডেটা NoSQL ডাটাবেসে সঞ্চিত হতে পারে। একাধিক ডাটাবেস ব্যবহার করে আপনি বিভিন্ন ডেটার জন্য পারফরম্যান্স অপটিমাইজেশন করতে পারেন।
  3. ভিন্ন ভিন্ন ডেটা সেন্টার ব্যবহার: একটি অ্যাপ্লিকেশন বিভিন্ন অঞ্চলে চলতে পারে, যেখানে প্রতি অঞ্চলে আলাদা ডাটাবেস ব্যবহার করা হয়।
  4. টেস্টিং এবং প্রোডাকশন আলাদা ডাটাবেস: কিছু ক্ষেত্রে, টেস্টিং এবং প্রোডাকশনের জন্য আলাদা ডাটাবেস ব্যবহার করা হয়।

Multiple DataSource Configuration উদাহরণ

এখানে একটি Spring Boot অ্যাপ্লিকেশনের উদাহরণ দেওয়া হবে, যেখানে দুটি ডাটাবেসের সাথে একসাথে কাজ করা হচ্ছে: একটি MySQL ডাটাবেস এবং একটি H2 ডাটাবেস।

১. Maven ডিপেনডেন্সি

pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করতে হবে:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- H2 Database for testing -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Spring Boot Starter Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

২. application.properties কনফিগারেশন

application.properties ফাইলে দুটি ডাটাবেসের কনফিগারেশন করা হবে:

# MySQL DataSource Configuration
spring.datasource.mysql.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.mysql.username=root
spring.datasource.mysql.password=root
spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

# H2 DataSource Configuration
spring.datasource.h2.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.h2.driverClassName=org.h2.Driver
spring.datasource.h2.username=sa
spring.datasource.h2.password=password
spring.datasource.h2.dialect=org.hibernate.dialect.H2Dialect

এখানে, spring.datasource.mysql দিয়ে MySQL ডাটাবেস এবং spring.datasource.h2 দিয়ে H2 ইন-মেমরি ডাটাবেস কনফিগার করা হয়েছে।

৩. Multiple DataSource Configuration Setup

Spring Boot-এ @Configuration ক্লাস ব্যবহার করে একাধিক DataSource, EntityManagerFactory, এবং TransactionManager কনফিগার করতে হবে।

DataSourceConfig.java

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.example.repository.mysql", // MySQL Repository Package
        entityManagerFactoryRef = "mysqlEntityManagerFactory",
        transactionManagerRef = "mysqlTransactionManager"
)
public class MySQLDataSourceConfig {

    @Primary
    @Bean(name = "mysqlDataSource")
    public DataSource mysqlDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Primary
    @Bean(name = "mysqlEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            @Qualifier("mysqlDataSource") DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setPackagesToScan("com.example.model"); // Model package for JPA
        return factoryBean;
    }

    @Primary
    @Bean(name = "mysqlTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("mysqlEntityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory.getObject());
        return transactionManager;
    }
}

H2DataSourceConfig.java

@Configuration
@EnableJpaRepositories(
        basePackages = "com.example.repository.h2", // H2 Repository Package
        entityManagerFactoryRef = "h2EntityManagerFactory",
        transactionManagerRef = "h2TransactionManager"
)
public class H2DataSourceConfig {

    @Bean(name = "h2DataSource")
    public DataSource h2DataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1");
        dataSource.setUsername("sa");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean(name = "h2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            @Qualifier("h2DataSource") DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setPackagesToScan("com.example.model"); // Model package for JPA
        return factoryBean;
    }

    @Bean(name = "h2TransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("h2EntityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory.getObject());
        return transactionManager;
    }
}

এখানে, MySQLDataSourceConfig এবং H2DataSourceConfig দুটি আলাদা কনফিগারেশন ক্লাস তৈরি করা হয়েছে, যেখানে দুইটি আলাদা ডাটাবেসের জন্য DataSource, EntityManagerFactory, এবং TransactionManager কনফিগার করা হয়েছে।

৪. Entity এবং Repository তৈরি করা

একটি Entity ক্লাস এবং Repository ইন্টারফেস তৈরি করা।

Employee.java (Entity)

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {

    @Id
    private Long id;
    private String name;

    // Getters and Setters
}

EmployeeRepository.java (Repository for MySQL)

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

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

সারাংশ

Multiple DataSource কনফিগারেশন Spring Boot অ্যাপ্লিকেশনে একাধিক ডাটাবেস ব্যবহার করার জন্য গুরুত্বপূর্ণ। Spring Data JPA এবং @Configuration ক্লাস ব্যবহার করে বিভিন্ন ডাটাবেসের জন্য

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...