首页 > 解决方案 > CSV 导出与 JPA 标准查询性能问题

问题描述

我正在尝试从我的 springboot 项目中将数据导出到 csv。我正在使用简单的条件查询并使用如下所示的 getResultStream 方法,但仅导出 1800 行需要一分钟。有人可以让我知道我做错了什么。

class SomeService{

    public void searchProductMasterExportList(RequestClass request,HttpServletResponse response){
    try(Stream<SomeModel> exportList = em.createQuery(query).getResultStream()){
    PrintWriter out = response.getWriter();

    exportList.forEach((todo -> createCsvLine(todo,out,em)
            ));
            out.flush();

    }

---createcsv 代码在下面 - 它用分隔符附加值。--将getter的名称更改为a、b、c、x等

private void createCsvLine(some parameters){
        StringBuilder line = new StringBuilder();
    line.append(null==productItemStreamData.x()?"":productItemStreamData.x()).append(",")
                        .append(null==x?"":x).append(",")
                        .append(null==productItemStreamData.getPlatform()?"":platformMap.get(productItemStreamData.y())).append(",")
                        .append(null==productItemStreamData.y()?"":productItemStreamData.getProductOwner()).append(",")
                        .append(null==productItemStreamData.getProductStatus()?"":productStatusMap.get(productItemStreamData.a())).append(",")
                        .append(null==productItemStreamData.a()?"":productItemStreamData.getDiscountPercentage()).append(",")
                        .append(null==productItemStreamData.b()?"":productItemStreamData.b()).append(",")
                        .append(null==productItemStreamData.c()?"":productItemStreamData.c()).append(",")
                        .append(null==productItemStreamData.getPriceStatus()?"":priceStatusMap.get(productItemStreamData.getPriceStatus())).append(",")
                        .append(null==productItemStreamData.getUnitOfMeasure()?"":productItemStreamData.getUnitOfMeasure()).append(",")
                        .append(null==productItemStreamData.d()?"":billingActionMap.get(productItemStreamData.d())).append(",")
                        .append(null==productItemStreamData.getFrequency()?"":frequencyMap.get(productItemStreamData.getFrequency())).append(",")
                        .append(null==productItemStreamData.getPriceType()?"":priceTypeMap.get(productItemStreamData.getPriceType())).append(",")
                        .append(null==productItemStreamData.getClientSegmentName()?"":clientSegmentMap.get(productItemStreamData.getClientSegmentName())).append(",")
                        .append(null==productItemStreamData.getPriceTierMin()?"":productItemStreamData.getPriceTierMin()).append(",")
                        .append(null==productItemStreamData.getPriceTierMax()?"":productItemStreamData.getPriceTierMax()).append(",")
                        .append(null==productItemStreamData.getListPrice()?"":productItemStreamData.getListPrice());

                out.write(line.toString());
                out.write("\n");
                em.detach(productItemStreamData);

    }

}


现在控制器就像

@RequestMapping(value = "/v1/export", method = RequestMethod.POST)
    public void exportProductItems(HttpServletResponse response,@RequestBody  ProductItemsSearchRequest request,@RequestHeader (name="ctm-JWT") String jwtToken) throws Exception {
        response.addHeader("Content-Type", "application/csv");
        response.addHeader("Content-Disposition", "attachment; filename="+fileName);
        response.setCharacterEncoding("UTF-8");
        service.searchProductMasterExportList(request,response);

    }

标签: performancespring-bootexport-to-csvcriteria-api

解决方案


推荐阅读