最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐

 更新時(shí)間:2023年07月04日 16:51:39   作者:它山之石,可以攻玉  
在某些特定的業(yè)務(wù)場景下,會(huì)需要使用自增的序列來維護(hù)數(shù)據(jù),本文主要介紹了Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在某些特定的業(yè)務(wù)場景下,會(huì)需要使用自增的序列來維護(hù)數(shù)據(jù),目前項(xiàng)目中因?yàn)槭褂肕ongoDB,顧記錄一下如何使用MongoDB實(shí)現(xiàn)自增序列。

MongoDB自增序列原理

MongoDB本身不具有自增序列的功能,但是MongoDB的$inc操作是具有原子性的,因?yàn)椴僮鞯脑有裕敲淳涂梢酝ㄟ^$inc序列+1的值作用本次序列,實(shí)現(xiàn)自增序列。

實(shí)現(xiàn)自增序列

定義自增序列IdSequence.java

@Document(collection = "sequences")
@Data
public class IdSequence {
    @Id
    private String id;
    /**
     * 自增的序列
     */
    private long nextId;
}

定義自增序列類型枚舉IdType.java

@Getter
@AllArgsConstructor
public enum IdType {
    /**
     * 圖書
     */
    BOOK("book");
    private final String type;
}

定義獲取自增序列輔助類IdHelper.java

@Component
public class IdHelper {
? ? private final MongoTemplate mongoTemplate;
? ? public IdHelper(MongoTemplate mongoTemplate) {
? ? ? ? this.mongoTemplate = mongoTemplate;
? ? }
? ? /**
? ? ?* 查詢指定類型的自增序列
? ? ?*
? ? ?* @param idType 類型
? ? ?* @return 自增序列
? ? ?*/
? ? public long nextId(IdType idType) {
? ? ? ? //構(gòu)建查詢對象
? ? ? ? Query query = Query.query(Criteria.where(LambdaUtil.getFieldName(IdSequence::getId)).is(idType.getType()));
? ? ? ? //構(gòu)建自增條件
? ? ? ? Update update = new Update().inc(LambdaUtil.getFieldName(IdSequence::getNextId), 1L);
? ? ? ? //構(gòu)建選項(xiàng)
? ? ? ? FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
? ? ? ? //查詢自增序列
? ? ? ? IdSequence idSequence = mongoTemplate.findAndModify(query, update, options, IdSequence.class);
? ? ? ? //返回自增序列
? ? ? ? return Objects.requireNonNull(idSequence).getNextId();
? ? }
}

定義測試類

@RestController
@RequestMapping(value = "/id")
public class IdSequenceController {
? ? @Resource
? ? private IdHelper idHelper;
? ? @GetMapping(value = "/nextId")
? ? public long nextId() {
? ? ? ? return idHelper.nextId(IdType.BOOK);
? ? }
}

總結(jié)

使用MongoDB實(shí)現(xiàn)自增序列是基于MongoDB的$inc操作指令,經(jīng)過測試100個(gè)并發(fā)下沒有發(fā)現(xiàn)重復(fù)id的產(chǎn)生,但是還是建議使用MongoDB自己的Id生成策略,畢竟MongoDB作為非關(guān)系型數(shù)據(jù)庫,如果維護(hù)一個(gè)自增序列,性能上肯定沒有ObjectId好,而且分片情況下需要自己校驗(yàn)自增序列的唯一性,當(dāng)然在某些特殊的業(yè)務(wù)場景下必須要使用自增序列的,也屬于正常。

到此這篇關(guān)于Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot MongoDB自增序列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java跳出循環(huán)的方式匯總

    java跳出循環(huán)的方式匯總

    本文介紹了Java中三種常用的跳出循環(huán)的語句:break、continue和return,break用于完全結(jié)束循環(huán)并跳出循環(huán)體;continue用于跳過本次循環(huán)體中尚未執(zhí)行的語句,開始下一次循環(huán);return用于結(jié)束方法,每種方法給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-02-02
  • Spring 事務(wù)事件監(jiān)控及實(shí)現(xiàn)原理解析

    Spring 事務(wù)事件監(jiān)控及實(shí)現(xiàn)原理解析

    本文首先會(huì)使用實(shí)例進(jìn)行講解Spring事務(wù)事件是如何使用的,然后會(huì)講解這種使用方式的實(shí)現(xiàn)原理。感興趣的朋友跟隨小編一起看看吧
    2018-09-09
  • 如何解決redisTemplate注入為空問題

    如何解決redisTemplate注入為空問題

    這篇文章主要介紹了如何解決redisTemplate注入為空問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java RocketMQ快速入門基礎(chǔ)知識(shí)

    java RocketMQ快速入門基礎(chǔ)知識(shí)

    這篇文章主要介紹了java RocketMQ快速入門基礎(chǔ)知識(shí),所以RocketMQ是站在巨人的肩膀上(kafka),又對其進(jìn)行了優(yōu)化讓其更滿足互聯(lián)網(wǎng)公司的特點(diǎn)。它是純Java開發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。,需要的朋友可以參考下
    2019-06-06
  • Spring Validation和Hibernate Validator結(jié)合國際化代碼實(shí)例

    Spring Validation和Hibernate Validator結(jié)合國際化代碼實(shí)例

    這篇文章主要介紹了Spring Validation和Hibernate Validator結(jié)合國際化代碼實(shí)例,我們需要對請求參數(shù)進(jìn)行非空、長度、正確性進(jìn)行校驗(yàn), 本文主要講解Spring Validation 和 Hibernate Validator, 同時(shí)整合i18n(國際化)實(shí)現(xiàn)參數(shù)校驗(yàn)自動(dòng),需要的朋友可以參考下
    2023-10-10
  • (starters)springboot-starter整合阿里云datahub方式

    (starters)springboot-starter整合阿里云datahub方式

    這篇文章主要介紹了(starters)springboot-starter整合阿里云datahub方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JAVA序列化和反序列化的底層實(shí)現(xiàn)原理解析

    JAVA序列化和反序列化的底層實(shí)現(xiàn)原理解析

    這篇文章主要介紹了JAVA序列化和反序列化的底層實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性

    淺析Spring boot 中 logback 配置<springPropert

    這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 詳解JAVA常用的時(shí)間操作【實(shí)用】

    詳解JAVA常用的時(shí)間操作【實(shí)用】

    本文主要介紹了JAVA一些常用的時(shí)間操作,很實(shí)用,相信大家在開發(fā)項(xiàng)目時(shí)會(huì)用到,下面就跟小編一起來看下吧
    2016-12-12
  • Springdoc替換swagger的實(shí)現(xiàn)步驟分解

    Springdoc替換swagger的實(shí)現(xiàn)步驟分解

    最近在spring看到的,spring要對api文檔動(dòng)手了,有些人說swagger不好用,其實(shí)也沒那么不好用,有人說代碼還是有點(diǎn)侵入性,這倒是真的,我剛試了springdoc可以說還是有侵入性但是也可以沒有侵入性,這就看你對文檔有什么要求了
    2023-02-02

最新評論

徐水县| 襄城县| 襄樊市| 沂源县| 繁昌县| 泸州市| 双江| 保山市| 东乌| 象山县| 香格里拉县| 务川| 辽宁省| 芷江| 呼玛县| 胶南市| 望谟县| 斗六市| 尚义县| 金山区| 教育| 香港| 巢湖市| 崇文区| 邢台县| 贞丰县| 获嘉县| 保亭| 苗栗县| 普安县| 龙口市| 嘉义县| 武平县| 澳门| 穆棱市| 弥渡县| 铅山县| 玉环县| 咸阳市| 寻乌县| 綦江县|