【SpringBoot】整体下载大文件与分批下载大文件(利用MySql数据库的Limit实现)
在前文里谈过一次性从数据库取一个大结果集有可能导致outofMemory,当时的想法是分批去取回来,今天把它实现了,特地把代码分享出来:
工程下载:https://files.cnblogs.com/files/xiandedanteng/CsvDownload20191027.rar
生成CSV文件的三个不同函数
package com.hy.csvdld.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.apache.log4j.Logger;
import com.hy.csvdld.Entity.Emp;
import com.hy.csvdld.service.EmpService;
// 用于生成CSV文件
public class CsvMaker {
private static Logger log = Logger.getLogger(CsvMaker.class);
public void makeTenCsv(File file, EmpService empService) {
try {
List<Emp> emps = empService.selectTenEmp();
FileWriter fileWriter = new FileWriter(file, true);
int index = 0;
for (Emp emp:emps) {
index++;
String info =""+index+","+ emp.asCsvLine()+ System.getProperty("line.separator");
fileWriter.write(info);
}
fileWriter.flush();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 整体下载方案
public void makeManyCsv(File file, EmpService empService,int count) {
try {
List<Emp> emps = empService.selectMany(count);
FileWriter fileWriter = new FileWriter(file, true);
int index = 0;
for (Emp emp:emps) {
index++;
String info =""+index+","+ emp.asCsvLine()+ System.getProperty("line.separator");
fileWriter.write(info);
}
fileWriter.flush();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 当count过大时,分批下载
public void makePartialCsv(File file, EmpService empService,int count) {
try {
int PartialSize=10000;
int times=count/PartialSize;
for(int i=0;i<times;i++){
log.info("第"+i+"批次处理");
FileWriter fileWriter = new FileWriter(file, true);
List<Emp> emps = empService.selectPartial(i*PartialSize, PartialSize);
int index = i*PartialSize;
for (Emp emp:emps) {
index++;
String info =""+index+","+ emp.asCsvLine()+ System.getProperty("line.separator");
fileWriter.write(info);
}
fileWriter.flush();
fileWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
具体SQL实现:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hy.csvdld.dao.EmpMapper">
<select id="selectTenEmp" resultType="com.hy.csvdld.Entity.Emp">
select id,name,age,cdate as ctime from emp order by id limit 10
</select>
<!-- 一次性取够 -->
<select id="selectManyEmp" resultType="com.hy.csvdld.Entity.Emp">
select id,name,age,cdate as ctime from emp order by id limit #{count}
</select>
<!-- 分批多次取 -->
<select id="selectPartialEmp" resultType="com.hy.csvdld.Entity.Emp">
select id,name,age,cdate as ctime from emp order by id limit #{start},#{size}
</select>
</mapper>
程序的优化,归根结底是两条路:空间换时间 或是 时间换空间,本文的分批取做法,是时间换空间的路数。
--END-- 2019年10月27日16:06:54
【SpringBoot】整体下载大文件与分批下载大文件(利用MySql数据库的Limit实现)的更多相关文章
- 利用MySQL数据库如何解决大数据量存储问题?
提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:1.数据的容量:1-3年内会大概多少条数据,每条 ...
- PHP7语法知识(四):目录文件操作、Cookie与Session、MySQL数据库的使用、Redis数据库、PHP处理XML与JSON
目录文件操作 一.目录 1.判断文件类型: 2.创建和删除目录: 3.打开读取和关闭目录 4.获得路径中目录部分 5.目录磁盘空间 二.文件操作 1.打开文件: 2.读取文件: 3.获得文件属性: 4 ...
- 大数据入门到精通13--为后续和MySQL数据库准备
We will be using the sakila database extensively inside the rest of the course and it would be great ...
- 利用mysql数据库日志文件获得webshell
查看配置 show variables like '%general%'; 开启日志功能 set GLOBAL general_log='ON'; 设置日志存储路径 SET GLOBAL genera ...
- 大数据的存储——HBase、HIVE、MYSQL数据库学习笔记
HBase 1.hbase为查询而生,它通过组织机器的内存,提供一个超大的内存hash表,它需要组织自己的数据结构,表在hbase中是物理表,而不是逻辑表,搜索引擎用它来存储索引,以满足实时查询的需求 ...
- JavaWeb 文件上传下载
1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...
- 转载:JavaWeb 文件上传下载
转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...
- MySQL数据库如何解决大数据量存储问题
利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...
- MySQL数据库中.SQL文件的导出方式
转自:http://tech.watchstor.com/management-117401.htm 在MySQL数据库中导入SQL文件是件很麻烦的事情,但是这是一项大家非常值得学习的技术,本文就从最 ...
随机推荐
- ifeq ifneq ifdef ifndef
条件语句中使用到了三个关键字:“ifeq”.“else”和“endif”.其中: 1. “ifeq”表示条件语句的开始,并指定了一个比较条件(相等).之后是用圆括号括包围的.使用逗号“, ...
- goroutine的设计与实现
goroutine背后的系统知识 http://www.sizeofvoid.net/goroutine-under-the-hood/ 下周写完
- tiny4412 串口驱动分析九 --- shell终端
作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...
- 用js刷剑指offer(从尾到头打印链表)
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ...
- Insufficient space for shared memory file 解决办法
Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file: /tmp/hsperfd ...
- Pytest【定制fixture】
在pytest中的fixture是在测试函数运行前后,由pytest执行的外壳函数,fixture中的代码可以定制,满足多变的测试需求:包括定义传入测试中的数据集.配置测试前系统的初始化状态.为批量测 ...
- python学习之模块(pip),列表生成式,模块操作mysql,excel
python基础 生成式 列表生成式 格式 [表达式 for 表达式 in 迭代对象 (可加判断)] 原: res1 = [] for i in range(1,5): res1.append(i) ...
- JavaScript 页面渲染
1. 从输入url到得到html的详细过程 1.1 加载资源的形式 输入 URL 或跳转页面 加载 html 1.2 加载一个资源的过程 浏览器根据DNS服务器得到域名的IP地址 向这个IP ...
- JAVA遇见HTML——JSP篇(1、JAVA WEB简介)
比如淘宝.新浪.搜狐.网易就是Web应用程序
- Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)
yyb大佬的博客 这线段期望好神啊... 还有O(nlogn)FFTO(nlogn)FFTO(nlogn)FFT的做法 Freopen大佬的博客 本蒟蒻只会O(n2)O(n^2)O(n2) CODE ...