performance - 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);
}
解决方案
推荐阅读
- google-sheets-macros - 如何将刚刚删除的值复制到“存档”表中?
- javascript - 如何在 react-naive 中获取文本组件值 onPress
- .htaccess - 网站在本地运行良好。将其放在 public_html 文件夹下后,我的 .glb 模型得到“404(未找到)”
- graphql - graphql - 从表单调用突变
- ada - 如何调试 Ada 程序?
- android - 处理导航返回按钮
- sql-server - 为什么我不能使用 VS 2019 社区在 SQL Server 2019 中创建边缘约束
- ruby-on-rails - 如何将 CoreUI 合并到 React Rails 应用程序中?
- machine-learning - 如何调试数学方程的实现
- objective-c - NSDocument 窗口关闭后如何释放内存?