1、概述

  • 请求远程大文本,使用流的方式进行返回。需要设置http链接的超时时间
  • 循环插入到List中,使用mybatis-plus批量插入到mysql中

2、需求

  • 两台服务器
  • 大文件放到其中一台服务器上
  • 另外一台服务器以文件流的形式请求数据
  • 批量插入到数据库中

3、实现思路

主要包括几个技术点:文件流提供;大文件数据读取;批量插入到数据库

1、文件流提供

使用springboot提供静态文件

  1. spring.resources.static-locations=file:/home/finance/h5/

2、大文件数据读取

设置HttpURLConnection的超时时间

3、批量插入数据库

使用mybtis-plus的批量插入,自定义sql

1000条分批次插入

4、代码

1、大文件数据读取

  1. public String doGet(String httpurl) {
  2. TestModel model=new TestModel();
  3. List<TestModel> list=new ArrayList<>();
  4. HttpURLConnection connection = null;
  5. InputStream is = null;
  6. BufferedReader br = null;
  7. String result = null;// 返回结果字符串
  8. try {
  9. // 创建远程url连接对象
  10. URL url = new URL(httpurl);
  11. // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
  12. connection = (HttpURLConnection) url.openConnection();
  13. // 设置连接方式:get
  14. connection.setRequestMethod("GET");
  15. // 设置连接主机服务器的超时时间:15000毫秒
  16. connection.setConnectTimeout(150000000);
  17. // 设置读取远程返回的数据时间:60000毫秒
  18. connection.setReadTimeout(600000000);
  19. // 发送请求
  20. connection.connect();
  21. // 通过connection连接,获取输入流
  22. if (connection.getResponseCode() == 200) {
  23. is = connection.getInputStream();
  24. // 封装输入流is,并指定字符集
  25. br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  26. // 存放数据
  27. String temp = null;
  28. int i=0;
  29. while ((temp = br.readLine()) != null) {
  30. if (i>0&&i % 1000 ==0){
  31. testMapper.insertBatch(list);//批量导入
  32. list=new ArrayList<>();
  33. }
  34. model=new TestModel();
  35. model.setId(String.valueOf(i++));
  36. model.setContent(temp);
  37. model.setCreatedTime(DateUtil.date());
  38. list.add(model);
  39. }
  40. }
  41. } catch (MalformedURLException e) {
  42. e.printStackTrace();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. } finally {
  46. // 关闭资源
  47. if (null != br) {
  48. try {
  49. br.close();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. if (null != is) {
  55. try {
  56. is.close();
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. connection.disconnect();// 关闭远程连接
  62. }
  63. return result;
  64. }

2、批量插入

1、controller

  1. @GetMapping("/addtmp")
  2. public void addtmp() {
  3. String url = "http://10.99.67.16:8081/test10wan.txt";
  4. long startTime = System.currentTimeMillis();//获取开始时间
  5. httpURLConnHelper.doGet(url);
  6. long endTime = System.currentTimeMillis();//获取结束时间
  7. System.out.println("测试代码块共耗时" + ((endTime - startTime)/1000) + "秒");//输出程序运行时间
  8. TestModel model=new TestModel();
  9. model.setId("00000000000000000000001");
  10. model.setContent("测试代码块共耗时" + ((endTime - startTime)/1000) + "秒");
  11. model.setCreatedTime(DateUtil.date());
  12. testService.save(model);
  13. }

2、mapper

  1. @Repository
  2. @Mapper
  3. public interface TestMapper extends BaseMapper<TestModel> {
  4. @Insert("<script>" +
  5. "INSERT INTO tmp_chenn_test(id,content,createdTime)VALUES" +
  6. "<foreach collection='testList' item='testModel' separator=','> " +
  7. "(#{testModel.id},#{testModel.content},#{testModel.createdTime})" +
  8. "</foreach> " +
  9. "</script>")//
  10. boolean insertBatch(List<TestModel> testList);
  11. }

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. JavaScript实现科学计算器

    运行效果: 可实现科学计算器的功能,如:PI,sin,cos,tan等 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> ...

  2. phpshe xml注入

    *php商城系统 xml注入* **页面样式* *Xml原理参考:* https://www.cnblogs.com/20175211lyz/p/11413335.html *漏洞函数simplexm ...

  3. numpy教程05---ndarray的高级操作

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  4. Spring Boot-自动配置之底层原理

    一.SpringBoot启动的时候加载主配置类,开启了自动配置的功能 @SpringBootApplication public class SpringBoot02Application { pub ...

  5. Mybatis注解开发(一对一)

    其他代码访问:Mybatis注解开发基础操作 1.添加OrderMapper接口 public interface OrderMapper { // @Select("select *,o. ...

  6. asp.net core启动源码以及监听,到处理请求响应的过程

    摘要 asp.net core发布至今已经将近6年了,很多人对于这一块还是有些陌生,或者说没接触过:接触过的,对于asp.net core整个启动过程,监听过程,以及请求过程,响应过程也是一知半解,可 ...

  7. Java学习day3

    今天跟着b站up的视频学习了方法定义调用与重载,以及类的封装. Java中的方法与c++当中的函数类似,只是定义格式为: public static void 方法名(){ 方法体 } 上完课做实验的 ...

  8. 纯css 实现充电动画

    <template>   <div class="container">     <div class="header">& ...

  9. 伪元素 Before & Aster

    1. html 结构 <label class="is-required" for="name">姓名</label> <inpu ...

  10. k8s入门之namespace(三)

    namespace的作用就是用来隔离资源,将同一集群中的资源划分为相互隔离的组.同一名称空间内的资源名称要唯一,但不同名称空间时没有这个要求.有些k8s资源对象与名称空间没有关系,例如 Storage ...