Hibernate Reactive 簡介

banq發表於2024-06-10

反應式程式設計是一種強調非同步資料流和非阻塞操作原則的程式設計正規化。其主要目標是構建能夠處理多個併發事件並實時處理的應用程式。

傳統上,在指令式程式設計中,我們按順序執行程式碼,一次一條指令。然而,在響應式程式設計中,我們可以同時處理多個事件,這使我們能夠建立響應更快、可擴充套件性更強的應用程式。

本教程將介紹Hibernate Reactive 程式設計,包括基礎知識、它與傳統指令式程式設計的區別,以及如何將 Hibernate Reactive 與Spring Boot結合使用的分步指南。

什麼是 Hibernate Reactive?
Reactive Hibernate 是Hibernate ORM 框架的擴充套件,廣泛用於將物件導向程式設計模型對映到關聯式資料庫。此擴充套件將反應式程式設計概念融入 Hibernate,使 Java 應用程式能夠更高效、更靈敏地與關聯式資料庫互動。透過整合非阻塞 I/O 和非同步資料處理等反應式原則,Reactive Hibernate 允許開發人員在其 Java 應用程式中建立高度可擴充套件且響應迅速的資料庫互動。

Hibernate Reactive 擴充套件了流行的 Hibernate ORM 框架,以支援反應式程式設計正規化。此擴充套件使開發人員能夠構建能夠處理大型資料集和高流量負載的反應式應用程式。Hibernate Reactive 的一個顯著優勢是它能夠促進非同步資料庫訪問,確保應用程式可以同時處理多個請求而不會造成瓶頸。

特殊之處
在傳統的資料庫互動中,當程式向資料庫傳送請求時,它必須等待響應才能繼續執行下一個任務。這種等待時間可能會累積起來,尤其是在嚴重依賴資料庫的應用程式中。Hibernate Reactive 引入了一種非同步處理資料庫互動的新方法。

這意味著程式不必等待每個資料庫操作完成後再繼續執行,而是可以在等待資料庫響應的同時執行其他任務。

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

這在高流量電子商務網站等場景中尤為重要,因為應用程式必須處理許多併發使用者或同時執行多個資料庫操作。

在這種情況下,Hibernate Reactive 在等待資料庫響應的同時繼續執行其他任務的能力可以極大地提高應用程式的效能和使用者體驗。Hibernate Reactive 為開發人員提供了構建高度可擴充套件和響應迅速的應用程式的工具。它使這些應用程式能夠在不犧牲效能的情況下處理繁重的資料庫工作負載。這證明了 Hibernate Reactive 在熟練的開發人員手中的潛力。解釋這些要點有助於理解 Hibernate Reactive 與傳統資料庫互動的不同之處,以及它為何有利於建立現代 Java 應用程式。但是,需要注意的是,Hibernate Reactive 可能並不適合所有用例,尤其是那些需要嚴格事務一致性或具有複雜資料訪問模式的用例。

Maven 依賴
在開始之前,我們需要將Hibernate Reactive Core和Reactive 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>

新增反應性儲存庫
在傳統的 Spring Data 中,儲存庫同步處理資料庫互動。反應式儲存庫非同步執行這些操作,使其響應更快。

1. 實體
實體與傳統應用程式中使用的傳統實體相同:

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

2. 反應式儲存庫介面
反應式儲存庫是擴充套件R2dbcRepository的專用介面,旨在支援使用關聯式資料庫 ( R2DBC )進行反應式程式設計。Hibernate 中的這些儲存庫提供了一系列針對非同步操作量身定製的方法,包括儲存、查詢、更新和刪除。這種非同步方法允許與資料庫進行非阻塞互動,使其非常適合高併發和高吞吐量應用程式:

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

反應式儲存庫返回反應式型別,例如Mono (用於單個結果)或Flux (用於多個結果),允許處理非同步資料庫互動。

新增反應式服務
在 Spring Boot 中,反應式服務旨在利用反應式程式設計原則非同步處理業務邏輯,從而提高應用程式的響應能力和可擴充套件性。與傳統的 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);
    }
}

與儲存庫類似,服務方法返回Mono或Flux等反應型別,允許它們執行非同步操作而不阻塞應用程式。

單元測試
反應式單元測試是軟體開發中必不可少的實踐,專注於單獨測試各個應用程式元件以確保其正常執行。特別是在反應式應用程式中,單元測試在驗證控制器、服務和儲存庫等反應式元件的行為方面起著至關重要的作用。對於反應式服務,單元測試對於確保服務方法表現出預期的行為非常重要,包括管理非同步操作和正確處理錯誤條件。這些測試有助於保證應用程式內反應式元件的可靠性和有效性:

public class ProductServiceUnitTest {
    @Autowired
    private ProductService productService;
    @Autowired
    private ProductRepository productRepository;
    @BeforeEach
    void setUp() {
        productRepository.deleteAll()
          .then(productRepository.save(new Product(1L, <font>"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();
    }
}

結論
在本教程中,我們介紹了使用 Hibernate Reactive 和 Spring Boot 構建反應式應用程式的基礎知識。我們還討論了反應式元件的優點以及如何定義和實現反應式元件。我們還討論了反應式元件的單元測試,強調了建立現代、高效且可擴充套件的應用程式的能力。