Я повторяю коллекцию Mongodb с Java для l oop, что создает проблему с памятью кучи - PullRequest
0 голосов
/ 26 мая 2020
@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);
}

1 Ответ

1 голос
/ 26 мая 2020

Проблема в том, что вы используете into(), который загружает все данные сразу в List, поэтому, возможно, перегрузка кучи, если данные очень большие.

Вместо этого вам следует использовать iterator(), который использует курсор базы данных для обработки данных один за другим, не загружая их в память приложения. Эта концепция не ограничивается Mon go, это общий механизм для всех баз данных (именно поэтому существует сама концепция курсоров).

Например:

...
FindIterable<Document> documentCursor = collection.find(document);
for (Document doc : documentCursor) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...