知識庫 / Reactive RSS 訂閱

Hibernate Reactive 簡介

Reactive,Spring
HongKong
10
11:09 AM · Dec 06 ,2025

1. 概述

反應式編程是一種編程範式,強調異步數據流和非阻塞操作的原則。其主要目標是構建能夠處理多個併發事件並實時處理這些事件的應用。

傳統上,在命令式編程中,我們一次執行一條指令,順序執行。然而,在反應式編程中,我們可以同時處理多個事件,這使得我們能夠創建更具響應性和可擴展性的應用程序。

本教程將涵蓋 Hibernate Reactive 編程,包括基本概念、它與傳統命令式編程的區別,以及使用 Hibernate Reactive 與 Spring Boot 的分步指南。

2. 什麼是 Hibernate Reactive?

Reactive Hibernate 是 Hibernate ORM 框架的擴展,廣泛應用於將面向對象編程模型映射到關係數據庫。該擴展將反應式編程概念整合到 Hibernate 中,使 Java 應用程序能夠更高效和響應式地與關係數據庫交互。通過整合反應式原則,如非阻塞 I/O 和異步數據處理,Reactive Hibernate 允許開發人員在 Java 應用程序中創建高度可擴展和響應式的數據庫交互。

Reactive Hibernate 擴展了流行的 Hibernate ORM 框架,以支持反應式編程範式。該擴展使開發人員能夠構建能夠處理大型數據集和高流量負載的反應式應用程序。Reactive Hibernate 的一個主要優勢在於其能夠促進異步數據庫訪問,確保應用程序可以在不造成瓶頸的情況下同時處理多個請求。

3. 獨特之處

在傳統的數據庫交互中,當程序向數據庫發送請求時,必須等待響應後再進行下一步操作。這種等待時間在大量依賴數據庫的應用中會累積,尤其是在高併發場景下。Hibernate Reactive 引入了一種新的方法,其中數據庫交互通過異步處理。

這意味着,程序可以在等待數據庫響應的同時,執行其他任務,而無需等待每個數據庫操作完成。

這個概念類似於在收銀員處理付款的同時繼續購物。Hibernate Reactive 通過允許程序在等待數據庫響應的同時執行其他任務,從而顯著提高應用程序的整體效率、性能、資源利用率和響應性。

這一點在諸如高流量電商網站等場景中尤為重要,這些網站需要同時處理大量併發用户或執行多個數據庫操作。

在這種情況下,Hibernate Reactive 能夠繼續執行其他任務,而無需等待數據庫響應,從而極大地提升應用程序的性能和用户體驗。Hibernate Reactive 為開發者提供了構建高度可擴展和響應式的應用程序的工具。它使這些應用程序能夠處理高負載的數據庫工作負載,而不會犧牲性能。這充分展示了 Hibernate Reactive 在熟練開發者手中藴含的潛力。闡述這些要點有助於理解 Hibernate Reactive 與傳統數據庫交互的區別以及它對創建現代 Java 應用程序的益處。然而,重要的是要注意,Hibernate Reactive 可能不適用於所有用例,特別是那些需要嚴格的事務一致性或具有複雜數據訪問模式的用例。

4. Maven 依賴

在開始之前,我們需要將 Hibernate Reactive CoreReactive Relational Database Connectivity (R2DBC) 依賴添加到 pom.xml 文件中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate.reactive</groupId>
    <artifactId>hibernate-reactive-core</artifactId>
</dependency>

5. 添加反應式倉庫

在傳統的 Spring Data 中,倉庫處理數據庫交互是同步進行的。反應式倉庫則以異步方式執行這些操作,從而使其更具響應性。

5.1. 實體

實體與傳統應用程序中使用的傳統實體相同。

@Entity
public class Product {
    @Id
    private Long id;
    private String name;
}

5.2. 反應式存儲接口

反應式存儲接口是專門設計的接口,擴展了 R2dbcRepository,旨在支持與關係數據庫(R2DBC)的反應式編程。這些存儲接口在 Hibernate 中提供了一系列針對異步操作的方法,包括保存、查找、更新和刪除。這種異步方法允許與數據庫進行非阻塞交互,非常適合高併發和高吞吐量的應用程序:

@Repository
public interface ProductRepository extends R2dbcRepository<Product, Long> {
}

反應式存儲庫返回反應式類型,例如 Mono (用於單個結果) 或 Flux (用於多個結果),從而允許處理異步數據庫交互。

6. 添加反應式服務

在 Spring Boot 中,反應式服務旨在通過利用反應式編程原則,異步處理業務邏輯,從而提高應用程序的響應性和可擴展性。與傳統的 Spring 應用程序不同,在傳統 Spring 應用程序中,服務類會同步執行業務邏輯,而反應式應用程序則具有服務方法返回反應式類型,以有效地管理異步操作。這種方法允許更高效地利用資源並更好地處理併發請求。

@Service
public class ProductService {
    private final ProductRepository productRepository;
    
    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public Flux<Product> findAll() {
        return productRepository.findAll();
    }

    public Mono<Product> save(Product product) {
        return productRepository.save(product);
    }
}

如 Repository、Service 方法返回反應式類型,例如 MonoFlux,從而允許它們在不阻塞應用程序的情況下執行異步操作。

7. 單元測試

反應式單元測試是軟件開發中的一項基本實踐,側重於隔離測試單個應用程序組件,以確保其正確運行。尤其是在反應式應用程序中,單元測試在驗證控制器、服務和存儲庫等反應式組件的行為方面發揮着至關重要的作用。 特別是在反應式服務方面,單元測試對於確保服務方法表現出預期的行為至關重要,包括管理異步操作和正確處理錯誤條件。這些測試有助於確保應用程序內反應式組件的可靠性和有效性。

public class ProductServiceUnitTest {
    @Autowired
    private ProductService productService;

    @Autowired
    private ProductRepository productRepository;
    @BeforeEach
    void setUp() {
        productRepository.deleteAll()
          .then(productRepository.save(new Product(1L, "Product 1", "Category 1", 10.0)))
          .then(productRepository.save(new Product(2L, "Product 2", "Category 2", 15.0)))
          .then(productRepository.save(new Product(3L, "Product 3", "Category 3", 20.0)))
          .block();
    }

    @Test
    void testSave() {
        Product newProduct = new Product(4L, "Product 4", "Category 4", 24.0);

        StepVerifier.create(productService.save(newProduct))
          .assertNext(product -> {
              assertNotNull(product.getId());
              assertEquals("Product 4", product.getName());
          })
          .verifyComplete();
        StepVerifier.create(productService.findAll())
          .expectNextCount(4)
          .verifyComplete();
    }

    @Test
    void testFindAll() {
        StepVerifier.create(productService.findAll())
          .expectNextCount(3)
          .verifyComplete();
    }
}

8. 結論

在本教程中,我們介紹了使用 Hibernate Reactive 和 Spring Boot 構建反應式應用程序的基礎知識。我們還討論了反應式組件的優勢以及如何定義和實現它們。此外,我們還討論了對反應式組件進行單元測試,強調了創建現代、高效和可擴展應用程序的能力。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.