前文里谈过一次性从数据库取一个大结果集有可能导致outofMemory,当时的想法是分批去取回来,今天把它实现了,特地把代码分享出来:

工程下载:https://files.cnblogs.com/files/xiandedanteng/CsvDownload20191027.rar

生成CSV文件的三个不同函数

  1. package com.hy.csvdld.util;
  2.  
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.List;
  7.  
  8. import org.apache.log4j.Logger;
  9.  
  10. import com.hy.csvdld.Entity.Emp;
  11. import com.hy.csvdld.service.EmpService;
  12.  
  13. // 用于生成CSV文件
  14. public class CsvMaker {
  15. private static Logger log = Logger.getLogger(CsvMaker.class);
  16.  
  17. public void makeTenCsv(File file, EmpService empService) {
  18. try {
  19. List<Emp> emps = empService.selectTenEmp();
  20.  
  21. FileWriter fileWriter = new FileWriter(file, true);
  22.  
  23. int index = 0;
  24. for (Emp emp:emps) {
  25. index++;
  26.  
  27. String info =""+index+","+ emp.asCsvLine()+ System.getProperty("line.separator");
  28. fileWriter.write(info);
  29. }
  30.  
  31. fileWriter.flush();
  32. fileWriter.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37.    // 整体下载方案
  38. public void makeManyCsv(File file, EmpService empService,int count) {
  39. try {
  40. List<Emp> emps = empService.selectMany(count);
  41.  
  42. FileWriter fileWriter = new FileWriter(file, true);
  43.  
  44. int index = 0;
  45. for (Emp emp:emps) {
  46. index++;
  47.  
  48. String info =""+index+","+ emp.asCsvLine()+ System.getProperty("line.separator");
  49. fileWriter.write(info);
  50. }
  51.  
  52. fileWriter.flush();
  53. fileWriter.close();
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58.  
  59. // 当count过大时,分批下载
  60. public void makePartialCsv(File file, EmpService empService,int count) {
  61. try {
  62. int PartialSize=10000;
  63. int times=count/PartialSize;
  64.  
  65. for(int i=0;i<times;i++){
  66. log.info("第"+i+"批次处理");
  67.  
  68. FileWriter fileWriter = new FileWriter(file, true);
  69.  
  70. List<Emp> emps = empService.selectPartial(i*PartialSize, PartialSize);
  71.  
  72. int index = i*PartialSize;
  73. for (Emp emp:emps) {
  74. index++;
  75.  
  76. String info =""+index+","+ emp.asCsvLine()+ System.getProperty("line.separator");
  77. fileWriter.write(info);
  78. }
  79.  
  80. fileWriter.flush();
  81. fileWriter.close();
  82. }
  83.  
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. }

具体SQL实现:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  4. <mapper namespace="com.hy.csvdld.dao.EmpMapper">
  5.  
  6. <select id="selectTenEmp" resultType="com.hy.csvdld.Entity.Emp">
  7. select id,name,age,cdate as ctime from emp order by id limit 10
  8. </select>
  9.    <!-- 一次性取够 -->
  10. <select id="selectManyEmp" resultType="com.hy.csvdld.Entity.Emp">
  11. select id,name,age,cdate as ctime from emp order by id limit #{count}
  12. </select>
  13. <!-- 分批多次取 -->
  14. <select id="selectPartialEmp" resultType="com.hy.csvdld.Entity.Emp">
  15. select id,name,age,cdate as ctime from emp order by id limit #{start},#{size}
  16. </select>
  17. </mapper>

程序的优化,归根结底是两条路:空间换时间 或是 时间换空间,本文的分批取做法,是时间换空间的路数。

--END-- 2019年10月27日16:06:54

【SpringBoot】整体下载大文件与分批下载大文件(利用MySql数据库的Limit实现)的更多相关文章

  1. 利用MySQL数据库如何解决大数据量存储问题?

    提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:1.数据的容量:1-3年内会大概多少条数据,每条 ...

  2. PHP7语法知识(四):目录文件操作、Cookie与Session、MySQL数据库的使用、Redis数据库、PHP处理XML与JSON

    目录文件操作 一.目录 1.判断文件类型: 2.创建和删除目录: 3.打开读取和关闭目录 4.获得路径中目录部分 5.目录磁盘空间 二.文件操作 1.打开文件: 2.读取文件: 3.获得文件属性: 4 ...

  3. 大数据入门到精通13--为后续和MySQL数据库准备

    We will be using the sakila database extensively inside the rest of the course and it would be great ...

  4. 利用mysql数据库日志文件获得webshell

    查看配置 show variables like '%general%'; 开启日志功能 set GLOBAL general_log='ON'; 设置日志存储路径 SET GLOBAL genera ...

  5. 大数据的存储——HBase、HIVE、MYSQL数据库学习笔记

    HBase 1.hbase为查询而生,它通过组织机器的内存,提供一个超大的内存hash表,它需要组织自己的数据结构,表在hbase中是物理表,而不是逻辑表,搜索引擎用它来存储索引,以满足实时查询的需求 ...

  6. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  7. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

  8. MySQL数据库如何解决大数据量存储问题

    利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...

  9. MySQL数据库中.SQL文件的导出方式

    转自:http://tech.watchstor.com/management-117401.htm 在MySQL数据库中导入SQL文件是件很麻烦的事情,但是这是一项大家非常值得学习的技术,本文就从最 ...

随机推荐

  1. Personalize Oracle Applications Home Page Browser Window Title

    修改登录页 http://expertoracle.com/2016/03/10/personalizing-the-e-business-suite-r12-login-page/ STEP 2 : ...

  2. 程序员与数据库打交道的JDBC知识概要

    1.JDBC全称:Java database connectivity,Java数据库连接. (1)           JDBC是一种用于执行SQL语句的Java API,为多种关系数据库提供多种统 ...

  3. c#创建目录和文件夹,数据写入并生成txt文件

    c#创建目录: // 获取程序的基目录.System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径.System.Diagnostics.Pro ...

  4. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  5. URL - Fiddler - IIS

    URL和URI URI:Uniform Resource Identifier,唯一标识一个网络资源 URL:Uniform Resource Locator,指向网络资源地址 URL是URI的子集, ...

  6. 用cef Python打造自己的浏览器

    背景 项目需要做一个客户端的壳,内置浏览器,访问指定 的url 采用技术 python3.5 cefpython https://github.com/cztomczak/cefpython#inst ...

  7. Dubbo:1

    Dubbo能解决什么问题 怎么去维护url:通过注册中心去维护url(zookeeper.redis.memcache…). F5硬件负载均衡器的单点压力比较大:软负载均衡. 怎么去整理出服务之间的依 ...

  8. FreeRTOS任务基础概念

    RTOS系统的核心就是任务管理: 任务的特性 在RTOS中每个任务都有自己的运行环境,不依赖于系统中其他的任务或者调度器,任何一个时间点只能有一个任务运行,具体运行哪个任务是由任务调度器来决定的,而任 ...

  9. Java&Selenium智能等待方法封装

    Java&Selenium智能等待方法封装 ExpectedConditions方法还有很多,自然也可以继续扩展很多 package util; import org.openqa.selen ...

  10. Js获取字符串的显示宽度/高度

    重点:1.在H5页面,文字大小单位为rem2.不同的font-family,文字的宽度不一样3.文字宽度同时受font-size和font-family影响 思路:在页面动态创建一个节点,设置节点的f ...