簡體   English   中英

使用 MongoDb 驅動程序的 Open Shift Container 中的 Java 內存堆空間問題

[英]Java Memory Heap Space Issue in Open Shift Container with MongoDb driver

下面的 Java 語法是在調用來自 Mongodb 數據庫的數據時在 Openshift 中拋出 Java 內存堆問題。任何人都可以用Java8 幫助我使用Pojo 類的每個synatx。這里Amount 是POJO 類。 或者任何其他建議也可以減少太多請求的內存。

public String getAmountDetails( @RequestParam("system") @Valid String system,
                                 @RequestParam("Claims") BigDecimal Claims,
                                 @RequestParam("Bills") BigDecimal totalOfCommissions,
                                 @RequestParam("taxes") BigDecimal totalOfSurcharges,
                                 @RequestParam("userDetails") BigDecimal userDetails,
                               ) throws Exception {

        Query Query = new Query();
       
        if (system != null && !system.isEmpty())
           Query.addCriteria(Criteria.where("system").is(system));
        List<Amount> amount = new ArrayList<>();
       
        amount = mongoOps.find(Query, Amount.class);
        amount.addAll(Amount);
       
        totalAmount = new Amount();
        if (Amount.isEmpty()) {
            totalAmount.setSystem(system);
            totalAmount.setClaims(BigDecimal.ZERO);
            totalAmount.setBillsBigDecimal.ZERO);
            totalAmount.setTaxes(BigDecimal.ZERO);
            totalAmount.setuserDetails(BigDecimal.ZERO);
            totalAmount.setStatus("Success");
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(totalAmount);
        }
        BigDecimal claims = new BigDecimal(0);
        BigDecimal bills = new BigDecimal(0);
        BigDecimal taxes = new BigDecimal(0);
        BigDecimal userDeatils = new BigDecimal(0);
      
       
        for (Amount amount : getAmount) {
            if (null != amount.getClaims()) {
                claimsAmt = claimsAmt.add(amount.getclaimsAmt().bigDecimalValue());
            }
            if (null != amount.getBillsAmt()) {
                billslAmt = billsAmt.add(amount.getBillsAmt().bigDecimalValue());
            }
            if (null != amount.gettaxesAmt()) {
                taxesAmt = taxesAmt.add(amount.getTaxesAmt().bigDecimalValue());
            }
            totalAmount.setClaims(claimsAmt);
            totalAmount.setbills(billsAmt);
            totalAmount.settaxesAmt(taxesAmt);
        }
       
    }

首先 - 你的 foreach 循環沒問題,除了你沒有顯示你正在迭代的getAmount是什么。 所以假設它是一個錯字,基本上你要求 mongo 根據一些標准為你帶來所有的“Amount”對象,而這一切只是為了計算一些值的總和。

如果數據庫中有很多對象,這將是:

  • 減緩
  • 內存消耗

我不會說這里有泄漏,只是無效的流程。 在 OpenShift 中,您可能會在一些“嚴重”的環境中工作,如果同時在大量對象上運行許多請求,您最終可能會遇到 OutOfMemory。

為了驗證這個理論,您可以記錄從 mongo 獲得的許多對象( amount列表的大小)。 如果您有相當大的數字,請繼續閱讀。

現在在解決方案方面:

所以也許你應該讓 mongo 為你計算一個總和,而不是用 Java 來計算。 即使集合中有很多文檔,Mongo 也會處理這個問題。

我已經很多年沒有使用 mongo,但它有一個聚合框架,應該使用$sum

閱讀 此 SO 線程,因為它們提供了如何在 mongo 中實現類似任務的示例。

您也可以閱讀此線程,了解您所做的更復雜的示例。

這是 mongo 文檔的鏈接,也可以派上用場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM