我正在使用Java for循环迭代Mongodb集合,这会造成堆内存问题 @RequestMapping(value=“/id/”,method=RequestMethod.GET) 公共字符串getClaimsDetailById(@RequestParam(value=“userId”)字符串userId, @RequestParam(value=“id”)字符串id)引发JsonProcessingException{ MongoDatabase数据库=this.mongoClient.getDatabase(this.database); MongoCollection collection=database.getCollection(this.collection); 列表声明=新的ArrayList(); 文档=新文档(“_id”,新ObjectId(id)); 列出索赔=收集.find(文档).into(索赔); List-claimsUpdatedList=new-ArrayList(); 用于(单据:索赔){ if(null!=doc.get(“Common”)){ documentcommon=(Document)doc.get(“common”); if(null!=common.get(“生效日期”)){ Date Date=(日期)common.get(“生效日期”); 普通认沽期权(“生效日期”,转换日期(日期)); } if(null!=common.get(“ExpirationDate”)){ Date Date=(日期)common.get(“到期日期”); 普通认沽期权(“到期日”,转换日(日期)); } 文件付诸表决(“普通”,普通); claimsUpdatedList.add(doc); } } JsonWriterSettings writerSettings=JsonWriterSettings.builder().outputMode(JsonMode.SHELL).indent(true.build(); 返回claimsUpdatedList.get(0.toJson)(writerSettings); }
问题在于您使用的是我正在使用Java for循环迭代Mongodb集合,这会造成堆内存问题 @RequestMapping(value=“/id/”,method=RequestMethod.GET) 公共字符串getClaimsDetailById(@RequestParam(value=“userId”)字符串userId, @RequestParam(value=“id”)字符串id)引发JsonProcessingException{ MongoDatabase数据库=this.mongoClient.getDatabase(this.database); MongoCollection collection=database.getCollection(this.collection); 列表声明=新的ArrayList(); 文档=新文档(“_id”,新ObjectId(id)); 列出索赔=收集.find(文档).into(索赔); List-claimsUpdatedList=new-ArrayList(); 用于(单据:索赔){ if(null!=doc.get(“Common”)){ documentcommon=(Document)doc.get(“common”); if(null!=common.get(“生效日期”)){ Date Date=(日期)common.get(“生效日期”); 普通认沽期权(“生效日期”,转换日期(日期)); } if(null!=common.get(“ExpirationDate”)){ Date Date=(日期)common.get(“到期日期”); 普通认沽期权(“到期日”,转换日(日期)); } 文件付诸表决(“普通”,普通); claimsUpdatedList.add(doc); } } JsonWriterSettings writerSettings=JsonWriterSettings.builder().outputMode(JsonMode.SHELL).indent(true.build(); 返回claimsUpdatedList.get(0.toJson)(writerSettings); },java,Java,问题在于您使用的是into(),它一次将所有数据加载到列表,因此如果数据非常大,可能会导致堆过载 相反,您应该使用迭代器(),它使用数据库游标逐个处理数据,而无需将数据加载到应用程序内存中。这个概念并不局限于Mongo,它是所有数据库的通用机制(这就是为什么存在游标的概念) 例如: @RequestMapping(value = "/id/", method = RequestMethod.GET) public String getClaimsDetailById(@RequestParam(
into()
,它一次将所有数据加载到列表
,因此如果数据非常大,可能会导致堆过载
相反,您应该使用迭代器()
,它使用数据库游标逐个处理数据,而无需将数据加载到应用程序内存中。这个概念并不局限于Mongo,它是所有数据库的通用机制(这就是为什么存在游标的概念)
例如:
@RequestMapping(value = "/id/", method = RequestMethod.GET)
public String getClaimsDetailById(@RequestParam(value = "userId") String userId,
@RequestParam(value = "id") String id) throws JsonProcessingException {
MongoDatabase database = this.mongoClient.getDatabase(this.database);
MongoCollection<Document> collection = database.getCollection(this.collection);
List claim = new ArrayList();
Document document = new Document("_id", new ObjectId(id));
List<Document> claims = collection.find(document).into(claim);
List<Document> claimsUpdatedList = new ArrayList<>();
for (Document doc : claims) {
if (null != doc.get("Common")) {
Document common = (Document) doc.get("Common");
if (null != common.get("EffectiveDate")) {
Date date = (Date) common.get("EffectiveDate");
common.put("EffectiveDate",convertDate(date));
}
if (null != common.get("ExpirationDate")) {
Date date = (Date) common.get("ExpirationDate");
common.put("ExpirationDate",convertDate(date));
}
doc.put("Common",common);
claimsUpdatedList.add(doc);
}
}
JsonWriterSettings writerSettings = JsonWriterSettings.builder().outputMode(JsonMode.SHELL).indent(true).build();
return claimsUpdatedList.get(0).toJson(writerSettings);
}
。。。
FindTable documentCursor=collection.find(文档);
用于(文档文档:documentCursor){
...
}
谢谢你宝贵的建议。你能给我举个例子吗?我是Mongod的新手。在回答中对你的代码做了一个示例修改。谢谢你的回答。这对我很有帮助。嗨,我已经格式化了你的代码。然而,代码转储不是一个好问题。请回答您的问题,并用简单的英语描述您有什么问题。内存问题是什么?是否有要包括的堆栈跟踪?另见。
...
FindIterable<Document> documentCursor = collection.find(document);
for (Document doc : documentCursor) {
...
}