Java实现http大文件流读取并批量插入数据库
1、概述
- 请求远程大文本,使用流的方式进行返回。需要设置http链接的超时时间
- 循环插入到List中,使用mybatis-plus批量插入到mysql中
2、需求
- 两台服务器
- 大文件放到其中一台服务器上
- 另外一台服务器以文件流的形式请求数据
- 批量插入到数据库中
3、实现思路
主要包括几个技术点:文件流提供;大文件数据读取;批量插入到数据库
1、文件流提供
使用springboot提供静态文件
spring.resources.static-locations=file:/home/finance/h5/
2、大文件数据读取
设置HttpURLConnection的超时时间
3、批量插入数据库
使用mybtis-plus的批量插入,自定义sql
1000条分批次插入
4、代码
1、大文件数据读取
public String doGet(String httpurl) {
TestModel model=new TestModel();
List<TestModel> list=new ArrayList<>();
HttpURLConnection connection = null;
InputStream is = null;
BufferedReader br = null;
String result = null;// 返回结果字符串
try {
// 创建远程url连接对象
URL url = new URL(httpurl);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) url.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(150000000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(600000000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 封装输入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// 存放数据
String temp = null;
int i=0;
while ((temp = br.readLine()) != null) {
if (i>0&&i % 1000 ==0){
testMapper.insertBatch(list);//批量导入
list=new ArrayList<>();
}
model=new TestModel();
model.setId(String.valueOf(i++));
model.setContent(temp);
model.setCreatedTime(DateUtil.date());
list.add(model);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
connection.disconnect();// 关闭远程连接
}
return result;
}
2、批量插入
1、controller
@GetMapping("/addtmp")
public void addtmp() {
String url = "http://10.99.67.16:8081/test10wan.txt";
long startTime = System.currentTimeMillis();//获取开始时间
httpURLConnHelper.doGet(url);
long endTime = System.currentTimeMillis();//获取结束时间
System.out.println("测试代码块共耗时" + ((endTime - startTime)/1000) + "秒");//输出程序运行时间
TestModel model=new TestModel();
model.setId("00000000000000000000001");
model.setContent("测试代码块共耗时" + ((endTime - startTime)/1000) + "秒");
model.setCreatedTime(DateUtil.date());
testService.save(model);
}
2、mapper
@Repository
@Mapper
public interface TestMapper extends BaseMapper<TestModel> {
@Insert("<script>" +
"INSERT INTO tmp_chenn_test(id,content,createdTime)VALUES" +
"<foreach collection='testList' item='testModel' separator=','> " +
"(#{testModel.id},#{testModel.content},#{testModel.createdTime})" +
"</foreach> " +
"</script>")//
boolean insertBatch(List<TestModel> testList);
}
Java实现http大文件流读取并批量插入数据库的更多相关文章
- java从文件中读取数据然后插入到数据库表中
实习工作中,完成了领导交给的任务,将搜集到的数据插入到数据库中,代码片段如下: static Connection getConnection() throws SQLException, IOExc ...
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)
1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...
- java中解析excel 批量插入数据库
Facade 层 实现类 (@Service("samePeriodModelImportFacade")) 1. 获取cells 的方法 public Cells getCel ...
- java获取远程网络图片文件流、压缩保存到本地
1.获取远程网路的图片 /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ public static byte[] getImage ...
- java使用ObjectInputStream从文件中读取对象
import java.io.EOFException;import java.io.FileInputStream;import java.io.FileNotFoundException;impo ...
- java+上传大文件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- java 上传大文件以及文件夹
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- Java 通过 BufferReader 实现 文件 写入读取 示例
package com.javatest.techzero.gui; import java.io.BufferedReader; import java.io.File; import java.i ...
随机推荐
- 反射常用API以及内省机制(代码)
学习内容: (1)获取构造函数 这里不贴Person类了,不然代码太多太乱了,只给出一些常用API // 创建字节码对象 Class<?> aClass = Class.forName(& ...
- java生成多级菜单树
使用java实现一个多级菜单树结构 先上数据库 ps_pid字段很重要,是父级菜单的id Menu类 Menu类要新增一个字段,用来存放子菜单 /** * 子菜单列表 */ private List& ...
- 一些有用的工具,iftop,iotop,htop,glances
一些有用的工具: yum install glances -y资源监控工具GLANCESglances 可以为 Unix 和 Linux 性能专家提供监视和分析性能数据的功能,其中包括:CPU 使用率 ...
- .NET 6 史上最全攻略
欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...
- Java学习day39
类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口. 类 ...
- 网络协议自动化逆向工具开山鼻祖discoverer 分析
本文系原创,转载请说明出处:信安科研人 也可关注微信公众号:信安科研人 原论文发表在2007年的USENIX上,链接如下:https://www.usenix.org/legacy/event/sec ...
- 技术分享 | Web自动化之Selenium安装
Web 应用程序的验收测试常常涉及一些手工任务,例如打开一个浏览器,并执行一个测试用例中所描述的操作.但是手工执行的任务容易出现人为的错误,也比较费时间.因此,将这些任务自动化,就可以消除人为因素.S ...
- XCTF练习题---MISC---Erik-Baleog-and-Olaf
XCTF练习题---MISC---Erik-Baleog-and-Olaf flag:flag{#justdiffit} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一个没有后缀名的文件, ...
- Prim 最小生成树 图解
什么是生成树 子图:G=<V,E>,G'=<V', E'>,为两个图(V为点集,即图中点的集合,E为边集),如果V'是V的子集且E'是E的子集,则G'是G的子图. 如果V' ...
- kill -9 进程杀不掉,怎么办?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 用ps和grep命令寻找僵尸进程 ps -A -ostat,ppid,pid,cmd | gr ...