最新要闻
- 汉语为桥 粽情西岸 当前热点
- 天天观点:究竟是驼背还是翘臀?全新奔驰GLC轿跑SUV插电混动版来了
- 马斯克和扎克伯格约架 马斯克母亲:确认取消了|世界视点
- 迪凡车业为旗下跃歌品牌保驾护航
- 理想L系列经常充到100%伤车吗? 李想:不会 放心用 电池寿命大于车|焦点快看
- 世界播报:浙江一男子躲雨后将屋主晒的菜踢到雨中 三观尽毁:网友称坏到骨子里
- 景区网红大雁被游客踢中要害离世 吓着孩子:网友愤怒 应重罚 世界动态
- 全球短讯!Win11最近一个月卡爆了!CPU占用高元凶终于找到:微软认错
- 内江第十一届大千龙舟文化节市中区端午民俗活动举行|独家
- 【世界独家】詹姆斯·卡梅隆谈泰坦号观光艇内爆导致5名乘员死亡:和泰坦尼克号沉没惊人相似 灾难再一次重演
- 微软誓要收购动视暴雪 索尼急了!PS6主机将封杀之|环球今日讯
- 前沿资讯!南孚旗下 益圆5号/7号碳性电池冲量:0.48元/节
- 车主自曝差点被闷死在特斯拉里:车辆完全死机 车门锁死_每日速讯
- 辽宁:2023年高考成绩24日16时发布|当前视点
- 当前滚动:理查森的大型CityLine办公楼开发项目上市
- 【天天新要闻】50斤重鳄雀鳝藏匿水库一年偷鱼吃 为何不负责放生屡禁不止?律师、专家释疑
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天即时看!mongodb 深度分页优化思路之cursor游标
mongodb 没有官方的游标滚动实现深度分页功能,建议的都是选择出一个字段,如_id,然后每次查询时限制该字段,而不进行分页处理。
也没有看到更优的实现方式,本文做一个大胆的假设,自行实现滚动分页功能。供大家思路参考。
但是猜想可以自行实现一个,简单思路就是,第一次查询时不带limit进行查询全量数据,然后自己通过cursor迭代出需要的行数后返回调用端,下次再调用时,直接取出上一次的cursor,再迭代limit的数量返回。
(资料图)
优势是只需计算一次,后续就直接复用结果即可。该功能需要有mongodb的clientSession功能支持。
但是需要复杂的自己维护cursor实例,打开、关闭、过期等。稍微管理不好,可能就客户端内存泄漏或者mongo server内存泄漏。
实践步骤:
1. 引入mongo 驱动:
org.mongodb mongodb-driver-sync 4.4.2 org.mongodb mongodb-driver-core 4.4.2 org.mongodb bson 4.4.2
注意版本不匹配问题,所以要引入多个包。
2. 创建测试类:
验证接入mongo无误,且造入适量的数据。
import static com.mongodb.client.model.Filters.eq;import com.mongodb.ConnectionString;import com.mongodb.MongoClientSettings;import com.mongodb.WriteConcern;import com.mongodb.client.*;import com.mongodb.client.result.InsertOneResult;import org.bson.Document;import org.junit.Before;import org.junit.Test;import org.openjdk.jmh.annotations.Setup;public class MongoQuickStartTest { private MongoClient mongoClient; @Before public void setup() { // Replace the placeholder with your MongoDB deployment"s connection string String uri = "mongodb://localhost:27017"; MongoClientSettings options = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)) .writeConcern(WriteConcern.W1).build(); mongoClient = MongoClients.create(options); } @Test public void testFind() {// ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017");// MongoClient mongoClient = MongoClients.create(connectionString); // Replace the placeholder with your MongoDB deployment"s connection string MongoDatabase database = mongoClient.getDatabase("local"); MongoCollectioncollection = database.getCollection("test01"); Document doc = collection.find(eq("name", "zhangsan1")).first(); if (doc != null) { System.out.println(doc.toJson()); } else { System.out.println("No matching documents found."); } } @Test public void testInsert() { Document body = new Document(); long startId = 60011122212L; MongoDatabase database = mongoClient.getDatabase("local"); MongoCollection collection = database.getCollection("test01"); int i; for (i = 0; i < 500000; i++) { String id = (startId + i) + ""; body.put("_id", id); body.put("name", "name_" + id); body.put("title", "title_" + id); InsertOneResult result = collection.insertOne(body); } System.out.println("insert " + i + " rows"); }}
3. 创建cursor的查询实现类并调用
基于springboot创建 controller进行会话测试,使用一个固定的查询语句进行分页测试。
import com.mongodb.ConnectionString;import com.mongodb.MongoClientSettings;import com.mongodb.WriteConcern;import com.mongodb.client.*;import org.bson.Document;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;@Servicepublic class MongoDbService { private MongoClient mongoClient; // 所有游标容器,简单测试,真正的管理很复杂 private Map> cursorHolder = new ConcurrentHashMap<>(); public void ensureMongo() { // Replace the placeholder with your MongoDB deployment"s connection string String uri = "mongodb://localhost:27017"; MongoClientSettings options = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)) .writeConcern(WriteConcern.W1).build(); mongoClient = MongoClients.create(options); } // 特殊实现的 cursor 滚动查询 public List findDataWithCursor(String searchAfter, int limit) { ensureMongo(); MongoDatabase database = mongoClient.getDatabase("local"); MongoCollection collection = database.getCollection("test01"); List resultList = new ArrayList<>(); MongoCursor cursor = cursorHolder.get(searchAfter); if(cursor == null) { // 第一次取用需要查询,后续直接复用cursor即可 cursor = collection.find().sort(new Document("name", 1)).iterator(); cursorHolder.put(searchAfter, cursor); } int i = 0; // 自行计数,到达后即返回前端 while (cursor.hasNext()) { resultList.add(cursor.next()); if(++i >= limit) { break; } } if(!cursor.hasNext()) { cursor.close(); cursorHolder.remove(searchAfter); } return resultList; }}
应用调用controller:
@Resource private MongoDbService mongoDbService; @GetMapping("/mongoPageScroll") @ResponseBody public Object mongoPageScroll(@RequestParam(required = false) String params, @RequestParam String scrollId) { return mongoDbService.findDataWithCursor(scrollId, 9); }
测试方式,访问接口:http://localhost:8080/hello/mongoPageScroll?scrollId=c,然后反复调用(下一页)。
如此,只要前端第一次查询时,不存在cursor就创建,后续就直接使用原来的结果。第一次可能慢,第二次就很快了。
结论,是可以简单实现的,但是生产不一定能用。因为,如何管理cursor,绝对是个超级复杂的事,何时打开,何时关闭,超时处理,机器宕机等,很难解决。
关键词:
天天即时看!mongodb 深度分页优化思路之cursor游标
记录liunx服务器和docker时区修改-天天热头条
汉语为桥 粽情西岸 当前热点
天天观点:究竟是驼背还是翘臀?全新奔驰GLC轿跑SUV插电混动版来了
马斯克和扎克伯格约架 马斯克母亲:确认取消了|世界视点
热文:https://editor.csdn.net/md/?articleId=131348876
迪凡车业为旗下跃歌品牌保驾护航
理想L系列经常充到100%伤车吗? 李想:不会 放心用 电池寿命大于车|焦点快看
世界播报:浙江一男子躲雨后将屋主晒的菜踢到雨中 三观尽毁:网友称坏到骨子里
景区网红大雁被游客踢中要害离世 吓着孩子:网友愤怒 应重罚 世界动态
全球短讯!Win11最近一个月卡爆了!CPU占用高元凶终于找到:微软认错
内江第十一届大千龙舟文化节市中区端午民俗活动举行|独家
【世界独家】詹姆斯·卡梅隆谈泰坦号观光艇内爆导致5名乘员死亡:和泰坦尼克号沉没惊人相似 灾难再一次重演
微软誓要收购动视暴雪 索尼急了!PS6主机将封杀之|环球今日讯
前沿资讯!南孚旗下 益圆5号/7号碳性电池冲量:0.48元/节
车主自曝差点被闷死在特斯拉里:车辆完全死机 车门锁死_每日速讯
辽宁:2023年高考成绩24日16时发布|当前视点
iOS 微信、支付宝、银联支付组件的进一步设计-天天播资讯
当前滚动:理查森的大型CityLine办公楼开发项目上市
【天天新要闻】50斤重鳄雀鳝藏匿水库一年偷鱼吃 为何不负责放生屡禁不止?律师、专家释疑
女子称41℃高温把盆里的衣服晒冒烟了!多地今日最高温40度:热热热
马斯克和扎克伯格约架 马斯克母亲发话:打打嘴仗算了|全球快资讯
世界速读:1. Spring相关概念
巡演拯救经济?外媒称霉霉巡演可能为美国带来46亿美元收入
土耳其央行2年来首次加息 焦点消息
真八角笼中决斗!马斯克发战书 扎克伯格接受了:科技大佬约架 都认真对待
端午假期遇上高考查分 各地高考成绩今天起陆续公布:各省成绩查询时间一览
天天快消息!张绍刚你好狠的心 剧中亲儿子都舍得杀!《长风渡》热度破万 你追了吗
地表最强三缸机!丰田全新GR卡罗拉赛道版限量发布:三缸榨出300匹马力
前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮
夏日健康帖丨出现这几个症状别大意!你可能已经中暑|每日热文
苹果尴尬!iOS系统比安卓难上手实锤了:易用性相差58% 环球讯息
正式牵手!苏州和上海地铁连起来了:无感换乘 比坐高铁方便多了-每日观点
端午“龙舟”天花板!广西桂林遇龙河现“巨龙巡游”:无比壮观
每日报道:国产操作系统赶超Win 10:插上U盘就能用
泰坦号壳体破裂沉没 乘员无一生还 世界热点评
创两月以来最大跌幅!特斯拉市值一夜蒸发3400亿元
被特斯拉坑了 半幅方向盘车型暂停上牌?多方回应 天天观点
读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量 全球最资讯
满汉全席所有菜谱(求满汉全席食谱 谁有)|天天最资讯
环球快看:凤凰古城端午热:众人跳水抓鸭 场面火爆!
megacli_sw服务器Raid卡的设置过程 环球快播
高温下北京白天现星星:肉眼可见金星、月亮同框|焦点短讯
视讯!Epic喜加二:《猎人:野性的呼唤》《遗忘国度之闲置冠军》免费
《最终幻想16》等级上限解答:新游戏+解锁100级-世界观速讯
爱奇艺王晓晖:影视不是一门好生意,却可以是伟大的生意
风靡至今什么意思(风靡一时是什么意思)
清远职业技术学校是大专还是中专_清远职业技术学校
焦点热议:使用近10年,说说向大家推荐Linux系统的理由
【世界速看料】吃下肚的粽子是用什么叶子包的?知道真相的人太少了!
中央气象台发布今年首个高温橙色预警:17站点最高气温破历史极值!
随着快船错过布罗格登,这件事情彻底暴露了3个可笑的事实
人人可用的开源数据可视化分析工具 焦点快报
文心一言 VS 讯飞星火 VS chatgpt (44)-- 算法导论6.1 1题_每日热议
天天讯息:周润发《别叫我“赌神”》豆瓣短评出炉:烂片没的说!
奇葩操作 男子让狗舔舐伤口消毒 医生:狗唾液细菌很多
【全球热闻】中央气象台发布今年首个高温橙色预警 17站点最高气温破历史极值
天天新消息丨关于高考一分一档数据分布的研究
每日简讯:《英雄联盟》夏季赛EDG 0:2不敌RNG:Uzi面对老东家无力回天
内蒙古乌兰浩特:民族团结庆端午
介绍CocosCreator系统事件是怎么产生及触发的
ChatGPT 会取代程序员吗?揭穿神话 世界观天下
7999元起 国人买iPhone 14 Pro需9.5%年收入引热议:你多久才能买?
外星人在美一户人家后院活动?别信:3D建模软件做的_当前资讯
寻找新的 AI 应用程序和 ChatGPT 工具的前 5 个网站
部署zabbix5_每日资讯
北京通州一业主私家车长期占用消防车通道且拒不整改 遭行政拘留7日
科学家付巧妹获得联合国首位阿勒福赞奖 从进化角度为人类健康问题带来新见解
郑州将于6月份发放5000万元汽车消费券 不限购买者户籍
著名球星贝克汉姆使用中文为中国粉丝献上端午祝福 网友热情回应
微软宣布Xbox Series X和XGP订阅服务将涨价 称其反应市场的竞争情况
美国亿万富翁家庭以91万元年薪招聘住家狗保姆 将狗的幸福放在首位
顺丰旗下大型无人机FH-98顺利降落 最大起飞重量5.25吨
余承东曾预告!中国自动驾驶迎来大进展:官方首次表态L3商用
天天微资讯!《英雄联盟》新英雄纳亚菲利玩法公布 这是真的狗!
为减少内卷 四家头部猪企发起“互不挖人公约”
贵州贵阳周边现奇幻红色湖泊 吸引众多游客前往打卡
第28届白玉兰奖评委见面会举行 《庆余年》导演称应杜绝文盲演员
吉林一市民驾车偶遇“拦路虎” 强调路边遇到老虎不要开车窗或下车
《超级马里奥兄弟 惊奇》公布 预计于本年10月20日发售
我国最长的深水油气管道完工 区域最大作业水深近1000米
辽宁铁岭一位母亲带着高考结束的女儿去整容 当事人提醒勿盲目去跟风
北京宣布对电动自行车进行管理 因含有尖锐的金属杆导致安全系数高
视讯!中国乡村“现象级”体育赛事频现
曾排名国内服装品牌第一:拉夏贝尔正式破产清算 世界快讯
世界今日讯!Java基础复习笔记详细版
xxx.opt-1.pyc、xxx.opt-2.pyc和xxx.pyc的区别-热点在线
每日热议!redis简单介绍和使用
尤文官方:35岁迪马利亚自由身离队,据悉将加盟本菲卡
高考生注意!明天起多地高考出分_世界新要闻
全球微动态丨盘点粽子界“显眼包”:各种奇葩口味粽子层出不穷
订单爆了?日产就奇骏e-POWER发布情况说明:满30天未提车获补偿|每日快报
Go-指针篇 世界滚动
首屈一指的首屈是什么意思(首屈一指的指是哪个指)_最资讯
长白山人参鲜参大促!10支独立包装券后仅39.9:煲汤超营养|报道
【天天新视野】99%人没用过的电视隐藏功能 宅家也能爽翻天
今日热搜:西湖边上卖花郎和卖花姑娘走红 本人:希望学习分享中国传统文化
京东四面面经整理|环球百事通
全球动态:OPEN AI 全新版本在线免费体验2.0.0支持最新对话模型,和16K上下文
学霸王小九防骗视频_学霸征集令 天天滚动