具有许多实体的规范和XML解析->内存不足错误

时间:2019-05-06 00:48:48

标签: java xml spring spring-data-jpa

我有一个请求,希望在我的数据库中找到一个带有规范的实体。

在获取g them I ne之后,将其解析为另一个实体,以便将其导出为XML文件。当我的规范涉及到很多实体(〜6000个)时,出现内存不足错误。

有人可以解决吗?我没有主意...(不能增加堆大小)

@RequestMapping(method = RequestMethod.GET, value = "/cmc")
public String getXmlExport(CmcCriteria cmcCriteria, Model model) throws CmcCommonsException {

    Specification<Cmc> cmcSpec = cmcService.getSpec(cmcCriteriaResource);
    List<Cmc> cmcList = cmcRepository.findAll(cmcSpec);

    model.addAttribute("requestCmcXml", getCmcXmlListFromCmcList(cmcList));
    return "cmc/list";
}


@Override
protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

    List<CmcXml> listeCmcXml = (List<CmcXml>) model.get("requestCmcXml");

    CmcXmlExport export = new CmcXmlExport();
    export.setPersonnels(listeCmcXml);
    response.setContentType(CONTENT_TYPE_XML);
    ServletOutputStream out = response.getOutputStream();
    JAXBContext context = JAXBContext.newInstance(CmcXmlExport.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(export, out);
    out.flush();

}

@XmlRootElement(name = "CMC")
public class CmcXmlExport {

    private List<CmcXml> personnels;
    [...]
}

@XmlType(propOrder = { "id", "nom", "prenom", "genre", [...] })
public class CmcXml implements Serializable {

private static final long serialVersionUID = 1L;

private int id;
private String nom;
private String prenom;
private String genre;
[...]
}

2 个答案:

答案 0 :(得分:0)

尝试为Java使用Apache Xerces lib:Official website。它鼓励编写更有效的代码以进行XML解析和处理。

此库为您提供了处理XML块的方法,您将不得不编写一些其他代码来解析您的实体。

答案 1 :(得分:0)

是否要求所有物品必须一次退货?可以说返回100个项目(或更方便的任何数字)页面中的数据来解决问题?

不知道这是否适合您,但是如果有大量数据,通常我会以这种方式设计端点。当然,如果使用分页进行此操作,则必须调整正在处理该数据的客户端,不知道您在使用该数据做什么,但是取决于用例,也许可以解决您的问题。

唯一的缺点是必须逐块读取数据的开销可能会使操作变慢。