成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

現(xiàn)代應(yīng)用中基于偏移量和游標(biāo)分頁(yè)的高效數(shù)據(jù)管理

譯文
存儲(chǔ) 數(shù)據(jù)管理
本文探索與Jakarta Data、Quarkus和MongoDB集成的基于偏移量和游標(biāo)的分頁(yè),強(qiáng)調(diào)它們?cè)赗EST API中的優(yōu)勢(shì)和實(shí)際用途。

譯者 | 李睿

審校 | 重樓

在軟件開(kāi)發(fā)中,有效地管理大型數(shù)據(jù)集至關(guān)重要。而檢索策略在提高性能和可擴(kuò)展性方面起著至關(guān)重要的作用,特別是在響應(yīng)時(shí)間非常關(guān)鍵的情況下。分頁(yè)是有效管理數(shù)據(jù)的一項(xiàng)核心技術(shù),它對(duì)于優(yōu)化性能和資源管理至關(guān)重要。本文將探討適用于不同場(chǎng)景和需求的兩種分頁(yè)策略:基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)。這些策略將幫助用戶了解分頁(yè)的重要性,以及它們?nèi)绾问顾麄兊南到y(tǒng)受益。

利用Jakarta Data,本文將探索這些分頁(yè)技術(shù)集成到使用Quarkus和MongoDB開(kāi)發(fā)的REST API中。這種組合展示了實(shí)際應(yīng)用的實(shí)現(xiàn),并突出了現(xiàn)代技術(shù)和先進(jìn)數(shù)據(jù)處理方法之間的協(xié)同作用。

本文旨在全面理解每種分頁(yè)方法的機(jī)制、優(yōu)點(diǎn)和權(quán)衡,使開(kāi)發(fā)人員能夠做出適合復(fù)雜和高需求應(yīng)用程序的明智決策。

分頁(yè):從古代卷軸到現(xiàn)代數(shù)據(jù)庫(kù)

分頁(yè)是數(shù)據(jù)組織中的一個(gè)重要概念,其根源可以追溯到最早的書(shū)面記錄形式。在現(xiàn)代應(yīng)用方法中,分頁(yè)將內(nèi)容劃分為離散的頁(yè)面,無(wú)論是印刷頁(yè)面還是數(shù)字頁(yè)面。通過(guò)使信息訪問(wèn)易于管理和直觀,以及通過(guò)限制在任何時(shí)間加載或呈現(xiàn)的數(shù)據(jù)量來(lái)增強(qiáng)數(shù)據(jù)檢索系統(tǒng)的性能來(lái)改進(jìn)用戶體驗(yàn)。

有效數(shù)據(jù)組織的必要性是一個(gè)復(fù)雜的難題。像羅馬這樣的古代文明發(fā)展了早期管理大量書(shū)面信息的方法。盡管古羅馬人沒(méi)有像現(xiàn)代人所理解的那樣使用分頁(yè)——將文本劃分為頁(yè)面,但他們實(shí)施了預(yù)示著現(xiàn)代分頁(yè)系統(tǒng)的組織方法。

在羅馬,長(zhǎng)文本通常寫(xiě)在紙莎草或牛皮紙制成的卷軸上。這些卷軸很長(zhǎng),采用索引和標(biāo)記來(lái)導(dǎo)航。這種標(biāo)記的作用類似于現(xiàn)代目錄,引導(dǎo)讀者閱讀不同的文本部分。雖然按照當(dāng)今的標(biāo)準(zhǔn)來(lái)看,這種方法很簡(jiǎn)陋,但它代表了一種早期的分頁(yè)形式,原因是它將信息組織成可以獨(dú)立訪問(wèn)的片段。

此外,羅馬人還使用蠟板來(lái)記錄較短的文件。這些蠟板可以裝訂在一起,形成一種類似于當(dāng)今書(shū)籍的結(jié)構(gòu)——手抄本(codex)。手抄本的出現(xiàn)是文本組織的一次重大演變,使人們能夠更快、更有效地獲取信息。用戶可以翻頁(yè),這顯然是當(dāng)前分頁(yè)系統(tǒng)的前身,顯著地提高了查看信息的速度和便利性。

在數(shù)字時(shí)代,分頁(yè)對(duì)于有效處理大型數(shù)據(jù)集至關(guān)重要。數(shù)字分頁(yè)通過(guò)分段交付內(nèi)容而不是要求同時(shí)加載整個(gè)數(shù)據(jù)集,有助于管理服務(wù)器負(fù)載并縮短響應(yīng)時(shí)間。它通過(guò)提供無(wú)縫的導(dǎo)航體驗(yàn)來(lái)節(jié)省資源,并改進(jìn)用戶與應(yīng)用程序的交互。

古羅馬的文本組織方法和現(xiàn)代數(shù)字分頁(yè)之間的相似之處突出了貫穿歷史的持續(xù)需求:有效地管理大量信息。無(wú)論是通過(guò)卷軸上的物理標(biāo)記、手抄本的開(kāi)發(fā),還是復(fù)雜的數(shù)字分頁(yè)算法,其核心挑戰(zhàn)仍然是一樣的——使信息可訪問(wèn)和可管理。

現(xiàn)代應(yīng)用中的分頁(yè):必要性和策略

分頁(yè)是現(xiàn)代軟件應(yīng)用程序中的一個(gè)基本特性,它有助于將數(shù)據(jù)組織成可管理的部分。這種方法通過(guò)防止信息過(guò)載來(lái)增強(qiáng)用戶體驗(yàn),并通過(guò)減少后端系統(tǒng)的負(fù)載來(lái)優(yōu)化應(yīng)用程序性能。當(dāng)對(duì)數(shù)據(jù)進(jìn)行分頁(yè)時(shí),系統(tǒng)一次只能查詢和呈現(xiàn)必要的數(shù)據(jù)子集,從而減少內(nèi)存使用并改善響應(yīng)時(shí)間。它在大型數(shù)據(jù)集或用戶高并發(fā)性應(yīng)用程序中尤其重要。在這些應(yīng)用程序中,高效的數(shù)據(jù)處理可以顯著提高可擴(kuò)展性和用戶滿意度。

分頁(yè)非常有用,但它也帶來(lái)了一些挑戰(zhàn)。開(kāi)發(fā)人員需要仔細(xì)平衡用戶體驗(yàn)和服務(wù)器性能。實(shí)現(xiàn)分頁(yè)需要在客戶端和服務(wù)器端附加邏輯,這會(huì)使其開(kāi)發(fā)變得更加復(fù)雜。雖然分頁(yè)可以通過(guò)只獲取部分?jǐn)?shù)據(jù)來(lái)減少初始加載時(shí)間,但它可能會(huì)增加用戶在多個(gè)頁(yè)面中導(dǎo)航時(shí)的總等待時(shí)間。而維護(hù)頁(yè)面之間的場(chǎng)景,例如排序和過(guò)濾器,也需要仔細(xì)的狀態(tài)管理,并增加了復(fù)雜性。

在現(xiàn)代網(wǎng)頁(yè)(Web)開(kāi)發(fā)中,有兩種主要的分頁(yè)策略:基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)。每種分頁(yè)策略都有優(yōu)點(diǎn)和缺點(diǎn),使其更適合不同的場(chǎng)景。

基于偏移量的分頁(yè)

基于偏移量的分頁(yè)是將數(shù)據(jù)劃分為可管理數(shù)據(jù)塊的傳統(tǒng)方法。在返回一定數(shù)量的記錄之前,跳過(guò)指定數(shù)量的記錄來(lái)訪問(wèn)數(shù)據(jù)。這種技術(shù)經(jīng)常用于Web和數(shù)據(jù)庫(kù)應(yīng)用程序中,以便使用簡(jiǎn)單的數(shù)字偏移量直接導(dǎo)航到特定的頁(yè)面。

圖1基于偏移量的分頁(yè)示意圖圖1基于偏移量的分頁(yè)示意圖

基于偏移量的分頁(yè)實(shí)現(xiàn)通常涉及數(shù)據(jù)庫(kù)查詢中的兩個(gè)關(guān)鍵參數(shù):

  • LIMIT:該參數(shù)指定在單個(gè)頁(yè)面中返回的最大記錄數(shù)。它定義了每個(gè)數(shù)據(jù)塊的大小,與分頁(yè)中的“頁(yè)面”概念保持一致。
  • OFFSET:該參數(shù)表示從數(shù)據(jù)集開(kāi)頭跳過(guò)的記錄數(shù)。OFFSET的值通常計(jì)算為(頁(yè)面-1)*頁(yè)面大小,允許用戶直接跳轉(zhuǎn)到任何頁(yè)面的開(kāi)頭。

基于偏移量的分頁(yè)因其簡(jiǎn)單和直接的實(shí)現(xiàn)而備受青睞。在用戶可以直接跳轉(zhuǎn)到特定頁(yè)面,并且記錄總數(shù)已知且相對(duì)穩(wěn)定的應(yīng)用程序中,這種方法尤其有效。這使得它非常適合用戶友好的導(dǎo)航和簡(jiǎn)單性至關(guān)重要的情況。

基于偏移量的分頁(yè)的主要限制是它在大型數(shù)據(jù)集上的可擴(kuò)展性。隨著數(shù)據(jù)集的增長(zhǎng)和用戶請(qǐng)求的頁(yè)面數(shù)量的增加,跳過(guò)許多記錄的成本也會(huì)增加。這將導(dǎo)致查詢性能變慢,因?yàn)槊總€(gè)后續(xù)頁(yè)面都需要計(jì)數(shù)和跳過(guò)更多記錄才能到達(dá)所需頁(yè)面的起始點(diǎn)。

如果底層數(shù)據(jù)需要插入、刪除或修改,用戶在頁(yè)面之間導(dǎo)航時(shí)可能會(huì)遇到“幻讀”或跳過(guò)記錄。發(fā)生這種情況是因?yàn)槠屏繘](méi)有考慮初始頁(yè)面加載后數(shù)據(jù)集大小或順序的變化。

基于偏移量的分頁(yè)由于其用戶友好的方法和易于實(shí)現(xiàn)的特點(diǎn),仍然是許多應(yīng)用程序的熱門選擇。然而,了解其局限性并正確規(guī)劃其使用對(duì)于確保系統(tǒng)在數(shù)據(jù)擴(kuò)展時(shí)保持響應(yīng)并提供良好的用戶體驗(yàn)至關(guān)重要。

基于游標(biāo)的分頁(yè)

基于游標(biāo)的分頁(yè)是在大型或動(dòng)態(tài)更新的數(shù)據(jù)集中管理數(shù)據(jù)檢索的有效方法。它使用游標(biāo)(對(duì)數(shù)據(jù)集中特定點(diǎn)的引用)從游標(biāo)位置開(kāi)始順序獲取數(shù)據(jù)。

圖2基于游標(biāo)的分頁(yè)示意圖圖2基于游標(biāo)的分頁(yè)示意圖

基于游標(biāo)的分頁(yè)依賴于游標(biāo)來(lái)指導(dǎo)數(shù)據(jù)獲取。游標(biāo)可以包含多個(gè)字段,以確保精確的數(shù)據(jù)檢索和維護(hù)排序順序。以下是它的結(jié)構(gòu):

(1)游標(biāo)字段

一個(gè)或多個(gè)字段唯一標(biāo)識(shí)數(shù)據(jù)集中每條記錄的位置。這些字段應(yīng)該是穩(wěn)定的(即設(shè)置之后不更改)和唯一的,以防止重復(fù)和確保數(shù)據(jù)完整性。常用的字段包括時(shí)間戳、唯一ID或多個(gè)字段的組合,以支持復(fù)雜的排序需求。

(2)查詢方向

這個(gè)指定數(shù)據(jù)檢索相對(duì)于游標(biāo)位置是向前移動(dòng)還是向后移動(dòng)。它在社交媒體訂閱源或日志監(jiān)控系統(tǒng)等可能感興趣的新條目或舊條目的應(yīng)用程序中非常有用。

(3)多個(gè)字段的使用

當(dāng)按多個(gè)條件排序時(shí)(例如,按creation_date和title對(duì)博客文章進(jìn)行排序),游標(biāo)可以包含這些字段,以確保分頁(yè)在查詢之間保持指定的排序順序。它對(duì)于一致性至關(guān)重要,特別是在數(shù)據(jù)集很大或經(jīng)常更新的情況下。

在分頁(yè)中使用游標(biāo)對(duì)于大型或頻繁更新的數(shù)據(jù)集特別有利,因?yàn)樗苊饬颂^(guò)記錄的性能開(kāi)銷,并確保對(duì)數(shù)據(jù)的一致訪問(wèn)。

雖然基于游標(biāo)的分頁(yè)提供了顯著的性能優(yōu)勢(shì)并增強(qiáng)了數(shù)據(jù)一致性,但其實(shí)現(xiàn)可能很復(fù)雜。它需要設(shè)置一個(gè)穩(wěn)定且唯一的游標(biāo),這可能具有挑戰(zhàn)性,特別是在沒(méi)有明顯唯一標(biāo)識(shí)符的數(shù)據(jù)集中。此外,它將用戶限制為順序?qū)Ш剑@在需要隨機(jī)訪問(wèn)數(shù)據(jù)的用例中可能是一個(gè)限制。調(diào)整用戶界面以平滑地使用基于游標(biāo)的分頁(yè),特別是在游標(biāo)中使用多個(gè)字段時(shí),也會(huì)增加開(kāi)發(fā)的復(fù)雜性。

在應(yīng)用程序中實(shí)現(xiàn)分頁(yè)時(shí),開(kāi)發(fā)人員通常必須在基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)之間進(jìn)行選擇。每種方法都有不同的優(yōu)勢(shì)和挑戰(zhàn)。為了做出明智的決策,了解這些方法在各個(gè)方面的比較是至關(guān)重要的,例如實(shí)現(xiàn)的容易程度、性能、數(shù)據(jù)一致性和用戶導(dǎo)航。為了幫助確定最適合軟件開(kāi)發(fā)中不同場(chǎng)景的分頁(yè)策略,下表提供了基于偏移量和基于游標(biāo)的分頁(yè)的全面比較,突出了關(guān)鍵特性和典型用例。此外,該表還考慮了可擴(kuò)展性。

功能

基于偏移量的分頁(yè)

基于游標(biāo)的分頁(yè)

描述

使用數(shù)字偏移量對(duì)數(shù)據(jù)進(jìn)行分頁(yè),以便在返回下一組記錄之前跳過(guò)幾條記錄

使用游標(biāo)(通常是唯一標(biāo)識(shí)符)從指定位置按順序獲取數(shù)據(jù)

實(shí)施

使用LIMIT和OFFSET參數(shù)實(shí)現(xiàn)基本的SQL或NoSQL查詢很簡(jiǎn)單

實(shí)現(xiàn)起來(lái)比較復(fù)雜,需要一個(gè)穩(wěn)定且唯一的字段作為游標(biāo)

最佳用例

非常適合中小型數(shù)據(jù)集和應(yīng)用程序,其中總數(shù)據(jù)計(jì)數(shù)和對(duì)任何頁(yè)面的直接訪問(wèn)是有益的

非常適合大型或動(dòng)態(tài)變化的數(shù)據(jù)集,其中性能和數(shù)據(jù)一致性至關(guān)重要

性能

性能隨著數(shù)據(jù)集大小的增加而下降,特別是當(dāng)訪問(wèn)由于跳過(guò)記錄的負(fù)載增加而導(dǎo)致的更高頁(yè)碼時(shí)

始終如一的高性能,因?yàn)樗苊饬颂^(guò)記錄和直接從游標(biāo)位置開(kāi)始訪問(wèn)數(shù)據(jù)的開(kāi)銷

數(shù)據(jù)一致性

如果底層數(shù)據(jù)發(fā)生變化,在分頁(yè)過(guò)程中容易出現(xiàn)幻讀或數(shù)據(jù)重復(fù)等問(wèn)題

提供更好的一致性,因?yàn)槊總€(gè)頁(yè)面加載取決于游標(biāo)的位置,這可以適應(yīng)數(shù)據(jù)的變化

用戶導(dǎo)航

允許用戶直接跳轉(zhuǎn)到任何特定頁(yè)面,方便隨機(jī)訪問(wèn)

通常將用戶限制為順序?qū)Ш剑@可能不適合所有應(yīng)用程序

查詢的復(fù)雜性

簡(jiǎn)單的查詢,直接的分頁(yè)邏輯

查詢可能很復(fù)雜,特別是當(dāng)多個(gè)字段用作游標(biāo)以維護(hù)順序和唯一性時(shí)

可擴(kuò)展性

由于較高偏移量增加了查詢負(fù)載,因此在較大數(shù)據(jù)集的情況下可擴(kuò)展性較差

高度可擴(kuò)展,特別有效地處理龐大的數(shù)據(jù)集

在處理大型數(shù)據(jù)集時(shí),了解分頁(yè)策略的效率和局限性至關(guān)重要。基于偏移量的分頁(yè)的一個(gè)主要挑戰(zhàn)是,隨著偏移量的增加,訪問(wèn)數(shù)據(jù)變得更加困難,特別是在大型數(shù)據(jù)集中。例如,如果一個(gè)數(shù)據(jù)集有100萬(wàn)條記錄,并被分成100個(gè)頁(yè)面,那么訪問(wèn)最后一個(gè)頁(yè)面(第10000頁(yè))將要求數(shù)據(jù)庫(kù)在傳遞最后100條記錄之前處理并丟棄最初的999,900條記錄。隨著數(shù)據(jù)集的增長(zhǎng),它可能導(dǎo)致更長(zhǎng)的加載時(shí)間,使得基于偏移量的分頁(yè)在處理大量數(shù)據(jù)時(shí)不太實(shí)用。

與基于偏移量的分頁(yè)相比,基于游標(biāo)的分頁(yè)是管理廣泛數(shù)據(jù)集的更有效的解決方案。對(duì)于基于偏移量的分頁(yè),高偏移量可能會(huì)導(dǎo)致性能問(wèn)題,但是基于游標(biāo)的分頁(yè)通過(guò)使用游標(biāo)跟蹤最后獲取的記錄來(lái)避免這些缺陷。該方法允許后續(xù)查詢從最后一個(gè)查詢結(jié)束的地方開(kāi)始,從而提高數(shù)據(jù)檢索速度。為了說(shuō)明這一點(diǎn),本文附帶的圖表比較了基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)在處理730萬(wàn)條記錄的數(shù)據(jù)集時(shí)的性能,顯示了使用游標(biāo)進(jìn)行分頁(yè)的速度優(yōu)勢(shì)顯著。

這種可視化表示強(qiáng)調(diào)了在考慮數(shù)據(jù)集大小和訪問(wèn)模式等因素的情況下選擇適當(dāng)分頁(yè)方法的戰(zhàn)略重要性。這確保了最佳的性能和用戶體驗(yàn),這是大規(guī)模數(shù)據(jù)處理的關(guān)鍵考慮因素。

圖3 MySQL中730萬(wàn)條記錄的基于偏移量和游標(biāo)的分頁(yè)(來(lái)源)圖3 MySQL中730萬(wàn)條記錄的基于偏移量和游標(biāo)的分頁(yè)(來(lái)源)

選擇基于偏移量的分頁(yè)還是基于游標(biāo)的分頁(yè)取決于應(yīng)用程序的特定需求。基于偏移量的分頁(yè)對(duì)于較小的數(shù)據(jù)集或需要直接頁(yè)面訪問(wèn)時(shí)效果很好,而基于游標(biāo)的分頁(yè)更適合大型或動(dòng)態(tài)數(shù)據(jù)集。接下來(lái),將在一個(gè)示例應(yīng)用程序中演示這兩種方法,以展示每種方法的實(shí)際含義。

實(shí)用的分頁(yè)介紹

本節(jié)將從關(guān)于分頁(yè)的理論討論過(guò)渡到實(shí)際演示,重點(diǎn)介紹實(shí)現(xiàn)基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)的不同方法。以下將探索這些概念,在與MongoDB配對(duì)的Quarkus應(yīng)用程序中使用Jakarta Data。這種設(shè)置能夠通過(guò)操作可管理的數(shù)據(jù)集來(lái)直接比較兩種分頁(yè)技術(shù)。

設(shè)定的目標(biāo)是提供一個(gè)清晰的示例,說(shuō)明如何使用Jakarta Data無(wú)縫集成和管理這兩種分頁(yè)策略,這是Java應(yīng)用程序中用于數(shù)據(jù)處理的強(qiáng)大工具集。雖然這個(gè)演示的重點(diǎn)是一個(gè)只涉及10個(gè)元素的簡(jiǎn)單場(chǎng)景,但重要的是要注意,所討論的原則和方法并不局限于小數(shù)據(jù)集。它們是可擴(kuò)展的,適用于更大的數(shù)據(jù)集,讓用戶有信心在現(xiàn)實(shí)場(chǎng)景中應(yīng)用這些策略。

此外,開(kāi)發(fā)一個(gè)全面的REST API(包括使用查詢參數(shù)和實(shí)現(xiàn)用于分頁(yè)的HATEOAS(超媒體作為應(yīng)用程序狀態(tài)引擎))的更廣泛的場(chǎng)景值得進(jìn)行詳細(xì)的討論。設(shè)計(jì)此類API所涉及的復(fù)雜性以及有效合并分頁(yè)的策略是在這里不深入研究的重要主題。與其相反,這一演示旨在介紹使用Jakarta Data進(jìn)行分頁(yè)的核心概念,重點(diǎn)關(guān)注分頁(yè)機(jī)制的技術(shù)實(shí)現(xiàn),而不是REST API設(shè)計(jì)的復(fù)雜性。最后將在文章結(jié)尾處為那些有興趣深入探索REST API構(gòu)建的更廣泛背景和細(xì)節(jié)的人員提供參考。

本文專門討論了Jakarta Data中可用的分頁(yè)特性。但是,需要注意的是,Jakarta Data提供了廣泛的功能,旨在簡(jiǎn)化Jakarta EE應(yīng)用程序的持久性集成。

Jakarta Data通過(guò)其API促進(jìn)分頁(yè),在管理大型數(shù)據(jù)集或需要復(fù)雜查詢功能的應(yīng)用程序中實(shí)現(xiàn)高效的數(shù)據(jù)處理和檢索。兩個(gè)主要組件支持分頁(yè)功能:

1.創(chuàng)建PageRequest

Jakarta Data提供了PageRequest類來(lái)封裝分頁(yè)請(qǐng)求。以下是如何指定不同類型的分頁(yè):

(1)基于偏移量的分頁(yè)

當(dāng)想要為數(shù)據(jù)檢索指定特定的頁(yè)面和大小時(shí),使用這個(gè)方法。它很簡(jiǎn)單,適合于已知項(xiàng)目總數(shù)的許多標(biāo)準(zhǔn)用例。

Java 
 PageRequest offSet = PageRequest.ofPage(1).size(10);

(2)基于游標(biāo)的分頁(yè)

這一方法用于處理連續(xù)數(shù)據(jù)流或數(shù)據(jù)集較大且經(jīng)常更新的情況。它允許從某一點(diǎn)連續(xù)獲取數(shù)據(jù),而無(wú)需重新查詢先前獲取的記錄。

Java 
 PageRequest cursor = PageRequest.ofSize(10).afterCursor(PageRequest.Cursor.forKey("key"));

這兩種方法都旨在通過(guò)限制每個(gè)查詢檢索的記錄數(shù)量來(lái)優(yōu)化數(shù)據(jù)獲取過(guò)程,從而提高性能和資源利用率。

2.特殊參數(shù)

Jakarta Data還允許使用特殊參數(shù)來(lái)增強(qiáng)存儲(chǔ)庫(kù)接口的功能。這些參數(shù)可用于進(jìn)一步優(yōu)化分頁(yè)策略,包括限制、排序和更復(fù)雜的分頁(yè)機(jī)制。

分頁(yè)查詢的標(biāo)準(zhǔn)返回結(jié)構(gòu)是頁(yè)面(Page)接口,它提供了一種處理分頁(yè)數(shù)據(jù)的簡(jiǎn)單方法。Jakarta Data提供了一個(gè)名為CursoredPage的專門版本,用于基于游標(biāo)的分頁(yè)。這種結(jié)構(gòu)對(duì)于傳統(tǒng)的基于頁(yè)面的導(dǎo)航不足或不實(shí)用的場(chǎng)景是有益的。

實(shí)際的例子

根據(jù)之前關(guān)于Jakarta Data分頁(yè)特性的討論,希望通過(guò)一個(gè)實(shí)際示例展示如何在實(shí)際應(yīng)用程序中實(shí)現(xiàn)這些功能。所展示的示例將Jakarta Data與Eclipse JNoSQL、Quarkus和MongoDB結(jié)合使用,以展示Jakarta Data的靈活性和強(qiáng)大功能,特別是它如何通過(guò)Jakarta Persistence與NoSQL和關(guān)系數(shù)據(jù)庫(kù)進(jìn)行接口。

對(duì)于那些有興趣探索完整代碼并深入了解其功能的人,可以在這里找到樣例項(xiàng)目:Quarkus Pagination with JNoSQL and MongoDB.

示例中的FruitRepository擴(kuò)展了BasicRepository,利用Jakarta Data的功能以一種簡(jiǎn)化的方式與數(shù)據(jù)庫(kù)進(jìn)行交互。這個(gè)存儲(chǔ)庫(kù)演示了Jakarta Data獲取和管理數(shù)據(jù)的三種主要方法:

(1)使用@Find注釋:通過(guò)允許直接基于注釋的查詢,簡(jiǎn)化了查詢過(guò)程。

(2)使用Jakarta Query Language:支持類似于SQL的更復(fù)雜的查詢,適合高級(jí)數(shù)據(jù)操作。

(3)按查詢約定使用方法:促進(jìn)基于方法命名約定的查詢,使代碼更易于閱讀和維護(hù)。

在FruitRepository中,實(shí)現(xiàn)了兩個(gè)特定的方法來(lái)處理分頁(yè):

Java 
 @Repository
 public interface FruitRepository extends BasicRepository<Fruit, String> {

 @Find
 CursoredPage<Fruit> cursor(PageRequest pageRequest, Sort<Fruit> order);

 @Find
 @OrderBy("name")
 Page<Fruit> offSet(PageRequest pageRequest);

 long countBy();
}
  • 基于游標(biāo)的分頁(yè):它利用CursoredPage<Fruit>來(lái)有效地管理大型數(shù)據(jù)集。這種方法在數(shù)據(jù)不斷更新的應(yīng)用程序中特別有用,因?yàn)樗峁┝艘环N穩(wěn)定和高性能的方式來(lái)處理順序數(shù)據(jù)檢索。
  • 基于偏移量的分頁(yè):它使用一個(gè)簡(jiǎn)單的Page<Fruit>來(lái)以更傳統(tǒng)的逐頁(yè)方式訪問(wèn)數(shù)據(jù)。這種方法簡(jiǎn)單明了,許多開(kāi)發(fā)人員都很熟悉,非常適合具有穩(wěn)定和可預(yù)測(cè)數(shù)據(jù)集的應(yīng)用程序。

這些示例說(shuō)明了Jakarta Data在處理不同分頁(yè)策略方面的多功能性,為開(kāi)發(fā)人員提供了基于其特定應(yīng)用程序需求的強(qiáng)大選項(xiàng)。這種方法不僅強(qiáng)調(diào)了Jakarta Data的實(shí)際應(yīng)用,而且強(qiáng)調(diào)了它在不同類型的數(shù)據(jù)庫(kù)和數(shù)據(jù)管理策略之間的適應(yīng)性。

在使用Jakarta Data的實(shí)際實(shí)現(xiàn)的基礎(chǔ)上,Quarkus應(yīng)用程序中的FruitResource類為基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)方法提供REST端點(diǎn)。這個(gè)設(shè)置有效地展示了這兩種策略之間的細(xì)微差別,以及如何將它們應(yīng)用于RESTful數(shù)據(jù)服務(wù)。

在FruitResource類中,為不同的分頁(yè)策略定義了兩個(gè)不同的REST端點(diǎn)。

這個(gè)端點(diǎn)演示偏移分頁(yè),其中客戶端可以將頁(yè)面和大小指定為查詢參數(shù)。它很簡(jiǎn)單,允許用戶直接跳轉(zhuǎn)到特定的頁(yè)面。這種方法對(duì)于總大小已知且需要在頁(yè)面之間進(jìn)行可預(yù)測(cè)導(dǎo)航的數(shù)據(jù)集特別有效。

Java 
 @Path("/offset")
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public Iterable<Fruit> hello(@QueryParam("page") @DefaultValue("1") long page,
 @QueryParam("size") @DefaultValue("2") int size) {
 var pageRequest = PageRequest.ofPage(page).size(size);
 return fruitRepository.offSet(pageRequest).content();
 }

這個(gè)端點(diǎn)滿足了基于游標(biāo)的分頁(yè),這對(duì)于處理大型或頻繁更新的數(shù)據(jù)集至關(guān)重要。游標(biāo)充當(dāng)指針,便于連續(xù)獲取記錄,而不會(huì)跳過(guò)之前的數(shù)據(jù)。這種方法確保了效率和一致性,特別是在處理實(shí)時(shí)數(shù)據(jù)流時(shí)。客戶端可以根據(jù)需要的導(dǎo)航方向提供前后游標(biāo)。

兩個(gè)端點(diǎn)都使用定義為ASC或DESC的Sort<Fruit>來(lái)確定獲取記錄的順序。通過(guò)確保數(shù)據(jù)按邏輯順序呈現(xiàn),這種排序順序增強(qiáng)了分頁(yè)的可用性。

Java 
 @Path("/cursor")
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public Iterable<Fruit> cursor (@QueryParam("after") @DefaultValue("") String after,
   @QueryParam("before") @DefaultValue("") String before,
 @QueryParam("size") @DefaultValue("2") int size) {
 if (!after.isBlank()) {
 var pageRequest = PageRequest.ofSize(size).afterCursor(PageRequest.Cursor.forKey(after));
 return fruitRepository.cursor(pageRequest, ASC).content();
 } else if (!before.isBlank()) {
 var pageRequest = PageRequest.ofSize(size).beforeCursor(PageRequest.Cursor.forKey(before));
 return fruitRepository.cursor(pageRequest, DESC).stream().toList();
 }
 var pageRequest = PageRequest.ofSize(size).size(size);
 return fruitRepository.cursor(pageRequest, ASC).content();
}

FruitResource類設(shè)計(jì)是一個(gè)很好的例子,說(shuō)明了如何定制不同的分頁(yè)方法以適應(yīng)特定的應(yīng)用程序需求。通過(guò)在單個(gè)應(yīng)用程序中比較這兩種方法,開(kāi)發(fā)人員可以獲得基于其數(shù)據(jù)特征和用戶需求選擇和實(shí)現(xiàn)最合適分頁(yè)策略的實(shí)際見(jiàn)解。這種方法不僅展示了Jakarta Data在使用Quarkus和MongoDB的微服務(wù)架構(gòu)中的能力,還增強(qiáng)了對(duì)RESTful服務(wù)設(shè)計(jì)和數(shù)據(jù)管理的理解。

結(jié)論

當(dāng)在Quarkus和MongoDB環(huán)境中使用Jakarta Data應(yīng)用基于偏移量的分頁(yè)和基于游標(biāo)的分頁(yè)的復(fù)雜性時(shí),已經(jīng)實(shí)現(xiàn)了Jakarta Data在管理數(shù)據(jù)檢索過(guò)程中的適應(yīng)性和有效性。這種探索提供了實(shí)際的用例,并強(qiáng)調(diào)了每種分頁(yè)方法的戰(zhàn)略優(yōu)勢(shì),使開(kāi)發(fā)人員能夠根據(jù)他們的應(yīng)用程序需求做出明智的決策。

本文為進(jìn)一步探索Jakarta Data的功能及其與Quarkus等現(xiàn)代應(yīng)用程序框架的集成提供了基礎(chǔ)。通過(guò)理解這些分頁(yè)技術(shù),開(kāi)發(fā)人員將能夠更好地構(gòu)建可擴(kuò)展且高效的應(yīng)用程序,這些應(yīng)用程序可以輕松地處理大型數(shù)據(jù)集。而在將來(lái),選擇和實(shí)現(xiàn)最合適的分頁(yè)策略對(duì)于優(yōu)化應(yīng)用程序性能和增強(qiáng)用戶體驗(yàn)至關(guān)重要。

參考文獻(xiàn)

原文標(biāo)題:Efficient Data Management With Offset and Cursor-Based Pagination in Modern Applications,作者:Otavio Santana




責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2023-08-07 09:18:32

Golang偏移量接口

2024-10-12 09:58:21

2024-03-21 07:08:53

AIntervalCronPython

2023-10-30 10:34:20

Golang數(shù)據(jù)庫(kù)

2016-02-25 14:40:01

云數(shù)據(jù)中心

2021-02-02 10:24:57

CIO數(shù)據(jù)管理IT

2024-12-12 16:21:16

2024-05-10 13:01:49

2022-04-02 10:42:04

數(shù)據(jù)管理數(shù)據(jù)管理現(xiàn)代化CIO

2022-08-15 10:45:34

RocketMQ消息隊(duì)列

2019-11-11 14:28:11

云計(jì)算數(shù)據(jù)IT

2021-12-03 14:52:46

Commvault

2020-04-18 11:15:38

云計(jì)算數(shù)據(jù)安全

2024-04-23 14:47:46

2024-02-26 09:15:05

2024-07-09 11:48:47

2012-09-18 09:39:57

Linq項(xiàng)目高效

2020-04-08 16:23:56

戴爾

2021-08-18 09:40:55

數(shù)據(jù)管理云原生Kubernetes

2023-09-20 14:54:17

MySQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 波波电影院一区二区三区 | 亚洲精品国产电影 | 国产乱码精品一区二区三区中文 | 亚洲视频免费在线观看 | 久久tv在线观看 | 在线国产一区 | 欧美成人激情 | 亚州综合一区 | 亚洲精品第一国产综合野 | 亚洲精品免费在线观看 | 亚洲国产精品一区 | 黄色日批视频 | 91在线精品一区二区 | 成人1区2区| 中文字幕在线播放第一页 | 91久久久久久久久久久 | 久久久涩| 请别相信他免费喜剧电影在线观看 | 高清av在线| 欧美日韩一 | 日韩高清一区 | 中文字幕久久久 | 亚洲视频欧美视频 | 国产精品一区二区福利视频 | 日韩欧美一区二区三区 | 国产污视频在线 | 午夜精品视频在线观看 | 久久国产精品无码网站 | 大象一区| 国产一区二区在线观看视频 | 国产欧美日韩综合精品一 | 91欧美精品成人综合在线观看 | 国产精品一区二区福利视频 | 日韩激情在线 | 91成人免费观看 | 国产精品呻吟久久av凹凸 | 日本三级全黄三级三级三级口周 | 国产xxxx搡xxxxx搡麻豆 | 成人免费精品视频 | 91精品国产综合久久久亚洲 | 精品日韩在线 |