การเชื่อมต่อกับ Database แบบ Reactive (เช่น R2DBC, MongoDB Reactive)

Sharing is caring!

การทำระบบด้วย Spring WebFlux ซึ่งเป็น reactive framework จำเป็นต้องคำนึงถึงทุกชั้นของแอปพลิเคชันให้ทำงานแบบ non-blocking รวมถึงการเชื่อมต่อกับฐานข้อมูล ซึ่งเป็นจุดสำคัญที่มักถูกมองข้าม บทความนี้จะแนะนำการใช้งาน R2DBC สำหรับฐานข้อมูลเชิง relational และ MongoDB Reactive สำหรับ NoSQL โดยใช้ Spring Boot

ทำไมต้องใช้ Reactive Database

  • JDBC เป็น synchronous และ blocking
  • WebFlux ต้อง non-blocking ตั้งแต่ Controller ถึง Database
  • R2DBC และ MongoDB Reactive รองรับการทำงานกับ Mono และ Flux

R2DBC คืออะไร

R2DBC (Reactive Relational Database Connectivity) คือมาตรฐานใหม่ในการเชื่อมต่อฐานข้อมูล SQL แบบ non-blocking

Gradle dependencies

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
  implementation("io.r2dbc:r2dbc-postgresql")
  runtimeOnly("org.postgresql:postgresql")
}

application.yml

spring:
  r2dbc:
    url: r2dbc:postgresql://localhost:5432/mydb
    username: user
    password: password
  sql:
    init:
      mode: always

Entity

@Table("users")
public class User {
  @Id
  private Long id;
  private String name;
}

Repository

public interface UserRepository extends ReactiveCrudRepository<User, Long> {
  Flux<User> findByName(String name);
}

Service

@Service
public class UserService {
  private final UserRepository repo;

  public UserService(UserRepository repo) {
    this.repo = repo;
  }

  public Flux<User> getAll() {
    return repo.findAll();
  }
}

MongoDB Reactive

MongoDB มี driver แบบ reactive ซึ่งสามารถใช้กับ Spring Boot ได้ทันทีผ่าน Spring Data MongoDB Reactive

dependencies

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
}

application.yml

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/mydb

Document

@Document("products")
public class Product {
  @Id
  private String id;
  private String name;
}

Repository

public interface ProductRepository extends ReactiveMongoRepository<Product, String> {
  Mono<Product> findByName(String name);
}

Controller

@RestController
@RequestMapping("/products")
public class ProductController {
  private final ProductRepository repository;

  public ProductController(ProductRepository repository) {
    this.repository = repository;
  }

  @GetMapping("/{name}")
  public Mono<Product> getByName(@PathVariable String name) {
    return repository.findByName(name);
  }
}

เปรียบเทียบ R2DBC และ MongoDB Reactive

หัวข้อR2DBCMongoDB Reactive
ประเภทฐานข้อมูลRelational (SQL)NoSQL
ความยืดหยุ่น schemaคงที่ยืดหยุ่น
การสนับสนุน Reactiveผ่าน R2DBCNative Support

ภาพประกอบระบบการทำงาน

ข้อควรระวัง

  • ห้ามใช้ JDBC ร่วมกับ WebFlux
  • ควรตรวจสอบว่า database driver รองรับ reactive หรือไม่
  • อย่าลืมเขียน fallback หรือ onError สำหรับ Mono และ Flux เสมอ

สรุป

  • R2DBC เหมาะกับระบบ SQL ที่ต้องการ performance แบบ non-blocking
  • MongoDB Reactive เหมาะกับระบบ NoSQL ที่เน้น scalability และความยืดหยุ่น
  • ทั้งสองสามารถใช้งานร่วมกับ Spring Boot WebFlux ได้อย่างสมบูรณ์

คำค้น SEO

Reactive Database Connectivity, R2DBC, MongoDB Reactive, spring webflux r2dbc, reactive crud repository, spring mongodb reactive, r2dbc vs jdbc, reactive persistence spring, non-blocking database spring boot

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *