[英]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.