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大文件流读取并批量插入数据库的更多相关文章

  1. java从文件中读取数据然后插入到数据库表中

    实习工作中,完成了领导交给的任务,将搜集到的数据插入到数据库中,代码片段如下: static Connection getConnection() throws SQLException, IOExc ...

  2. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  3. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

  4. java中解析excel 批量插入数据库

    Facade 层 实现类 (@Service("samePeriodModelImportFacade")) 1.  获取cells 的方法 public Cells getCel ...

  5. java获取远程网络图片文件流、压缩保存到本地

    1.获取远程网路的图片 /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ public static byte[] getImage ...

  6. java使用ObjectInputStream从文件中读取对象

    import java.io.EOFException;import java.io.FileInputStream;import java.io.FileNotFoundException;impo ...

  7. java+上传大文件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  8. java 上传大文件以及文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  9. Java 通过 BufferReader 实现 文件 写入读取 示例

    package com.javatest.techzero.gui; import java.io.BufferedReader; import java.io.File; import java.i ...

随机推荐

  1. numpy---(精简)

    numpy get started 导入numpy库, 并查看版本 import numpy as np np.__version__ '1.14.3' # pyplot显示画图, 数据分析与可视化 ...

  2. Java学习day21

    今天学习了弹窗,除了此前学的按键以外,弹窗也是程序中广泛使用到的一个方面 做了一个简单的弹窗 除了按键以外,有时候我们需要在界面上显示更多的内容,甚至是图片等,这个时候就需要使用到标签 通过标签和Ic ...

  3. Anaconda下安装Tensorflow、keras问题及解决办法

    这两天一直在跟tensorflow的错误日志作斗争!安装过程中出现各种问题,找资料,采坑,终于装好了,做个小总结! keras需要在TensorFlow之上才能运行,所以需要先安装TensorFlow ...

  4. go语言编译过程概述

    go语言编译过程概述 总结自<go语言设计与实现> 名词解释: 中间代码 中间代码是编译器或者虚拟机使用的语言,它可以来帮助我们分析计算机程序.在编译过程中,编译器会在将源代码转换到机器码 ...

  5. 详解javascript的eventloop(一)

    先看一段代码 console.log('Hi') setTimeOut(function cb1(){ console.log('cb1') },500) console.log('Bye') 第一步 ...

  6. 深度剖析text-align家族

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  7. Go 语言字符串常见操作

    @ 目录 1. 字节数组 2. 头尾处理 3. 位置索引 4. 替换 5. 统计次数 6. 重复 7. 大小写 8. 去除字符 9. 字符串切片处理 10. 数值处理 1. 字节数组 字节与字符的区别 ...

  8. ICO图标在线生成转换网站

    ico是Icon file的缩写,是Windows的图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件. 在Windows操作系统中,单个图标的文件名后缀是.ICO.这种格式的图标可以在W ...

  9. 解决go-micro与其它gRPC框架之间的通信问题

    在之前的文章中分别介绍了使用gRPC官方插件和go-micro插件开发gRPC应用程序的方式,都能正常走通.不过当两者混合使用的时候,互相访问就成了问题.比如使用go-micro插件生成的gRPC客户 ...

  10. Elemnt ui 组件封装(form)

    <template> <el-form class="form" :inline="formConfig.inline" :model=&qu ...