项目场景:

同步数据:将一个系统中的数据导出之后通过定时任务导入到另一个数据库中

问题描述:

定时任务将约100万行数据导入mysql,调试了好久,大多是关于 JVM 的问题,最后通过每1万条插入一次解决,具体上限多少条就报错没有测试,与电脑性能有关

分批次导入 代码:

分次持久化, 避免内存溢出

   /*** 导入文件* @param filePath 读取的文件路径* @param size 读取多少条持久化一次*/public void importFile(String filePath, Integer size) throws IOException, ParseException {InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "UTF-8");BufferedReader br = new BufferedReader(isr,5*1024*1024);// 用5M的缓冲读取文本文件List<String> list = new ArrayList<>(1024);int count = 0;String line = null;//跳过标题String title = br.readLine();//读取文本while ((line = br.readLine()) != null) {//一行数据String[] arr = line.split(",");//组装实体数据list.add(arr[0]);if (list.size() >= size){count++;//调用批量插入//service.batchInsert(list);log.info("数据列表长度: " + list.size());log.info("持久化: " + count + "次");list.clear();//清空list, 释放引用对象, 避免内存溢出}}if (list.size() > 0){count++;//调用批量插入//service.batchInsert(list);log.info("数据列表长度: " + list.size());log.info("持久化最后一次: " + count);//list.clear();}}

文件拆分导入 代码:

给定带拆分数量,计算出每个文件的平均字节数,然后循环文件数进行每个文件的拆分。拆分第一个文件时,根据平均字节数往后取给定的大约行字节数的字节,然后循环字节判断是否为\r或者\n,如果字节为\r或者\n则代表到达行末尾,记录行尾字节位置。知道了开头字节位置与结束字节位置,就可以将此位置之间的数据生成子文件了。继续循环拆分下个文件,基于上个文件记录的结束字节位置继续计算当前文件的结束位置,直到到达拆分文件的数量或者大文件读取完毕。

   /*** 拆分大文件* fileCount 拆分的文件个数*/public static void splitFile(String filePath, int fileCount) throws IOException {FileInputStream fis = new FileInputStream(filePath);FileChannel inputChannel = fis.getChannel();final long fileSize = inputChannel.size();long average = fileSize / fileCount;//平均值long bufferSize = 200; //缓存块大小,自行调整ByteBuffer byteBuffer = ByteBuffer.allocate(Integer.valueOf(bufferSize + "")); // 申请一个缓存区long startPosition = 0; //子文件开始位置long endPosition = average < bufferSize ? 0 : average - bufferSize;//子文件结束位置for (int i = 0; i < fileCount; i++) {if (i + 1 != fileCount) {int read = inputChannel.read(byteBuffer, endPosition);// 读取数据readW:while (read != -1) {byteBuffer.flip();//切换读模式byte[] array = byteBuffer.array();for (int j = 0; j < array.length; j++) {byte b = array[j];if (b == 10 || b == 13) { //判断\n\rendPosition += j;break readW;}}endPosition += bufferSize;byteBuffer.clear(); //重置缓存块指针read = inputChannel.read(byteBuffer, endPosition);}}else{endPosition = fileSize; //最后一个文件直接指向文件末尾}FileOutputStream fos = new FileOutputStream(filePath + (i + 1));FileChannel outputChannel = fos.getChannel();inputChannel.transferTo(startPosition, endPosition - startPosition, outputChannel);//通道传输文件数据outputChannel.close();fos.close();startPosition = endPosition + 1;endPosition += average;}inputChannel.close();fis.close();}

Java向mysql导入大量scv文件数据(100万行以上)相关推荐

  1. mysql导入sql文件限制,Mysql导入大容量SQL文件数据有关问题

    Mysql导入大容量SQL文件数据问题 MySQL在通过导入sql文件可能会出现下面二个问题: 1.如果sql文件过大,会出现"MySQL server has gone away" ...

  2. Mysql导入大容量SQL文件数据问题

    mysql在通过导入sql文件可能会出现下面二个问题: 1.如果sql文件过大,会出现"MySQL server has gone away"问题;   2.如果sql文件数据有中 ...

  3. 运行cmd状态下MySQL导入导出.sql文件

    MySQL导入导出.sql文件步骤如下: 一.MySQL的命令行模式的设置: 桌面->我的电脑->属性->环境变量->新建-> PATH=":path\mysq ...

  4. 巨坑:从Sqoop导入MySQL导入TINYINT(1)类型数据到hive(tinyint),数据为null

    问题描述 从Sqoop导入MySQL导入TINYINT(1)类型数据到hive(tinyint),数据为null 问题原因 Sqoop在抽取数据到Hive或者HDFS时,会自动将类型为Tinyint( ...

  5. mysql数据库导入sql文件Mysql导入导出.sql文件的方法

    mysql数据库导入sql文件:Mysql导入导出.sql文件的方法 mysql导入sql文件:Mysql导入导出.sql文件 步骤如下: 一.MYSQL的命令行模式的设置: 桌面->我的电脑- ...

  6. 使用T-SQL导入多个文件数据到SQL Server中一文的疑惑

    - 今天,由于毕业论文需要,我想弄数据转换,所以看了一看T-SQL,oracle实在没时间去学,好在SQL我还是很熟悉,所以打算看一看,写一些存储过程来完成任务. 我无意中在csdn上找到这样一篇文章 ...

  7. java对mysql的简单操作——增加数据

    java连接mysql5.1教程(含代码)+ 查询数据 下面是数据添加片段的代码 Connection conn = null; Statement stmt = null; PreparedStat ...

  8. java对mysql的简单操作——删除数据

    java连接mysql5.1教程(含代码)+ 查询数据 相关文章推荐: java对mysql的简单操作--增加数据 下面是数据删除片段的代码 Connection conn = null; State ...

  9. 利用JAVA向Mysql插入一亿数量级数据—效率测评

    利用JAVA向Mysql插入一亿数量级数据-效率测评 这几天研究mysql优化中查询效率时,发现测试的数据太少(10万级别),利用 EXPLAIN 比较不同的 SQL 语句,不能够得到比较有效的测评数 ...

  10. mysql 导入8msql文件_MySQL导入大容量SQL文件数据问题

    mysql在通过导入sql文件可能会出现下面二个问题: 1.如果sql文件过大,会出现"MySQL server has gone away"问题; - 2.如果sql文件数据有中 ...

最新文章

  1. mysql过滤复制的实现
  2. java dateformat类_JAVA--常量池,Date类,SimpleDateFormat类与Calendar类
  3. 【隐私】大数据下的隐私威胁【转载】
  4. 数组去重(JavaScript)先从网上整理一波,待验证
  5. redis位图法统计活跃用户+统计3天的连续登录用户案例
  6. 如何在jsp页面中连接mysql数据库_如何使用JSP访问MySQL数据库
  7. 洛阳计算机学校排名2015年,洛阳最好的中专学校有哪些 十大中专学校排名
  8. javascript Arrow functions(箭头函数)
  9. 源码安装MySQL5.5.20
  10. Spark 基础——RDD 算子
  11. Hadoop 2.x MapReduce(MR V1)字数统计示例
  12. 跟着开源项目学因果推断——mr_uplift(十五)
  13. Flotherm 2021热仿真分析基础到高级视频教程
  14. Gateway之过滤器
  15. 李开复写给中国大学生的信
  16. 结合量价持仓分析的股指期货日内交易策略
  17. android 优秀框架整理
  18. Frequent Pattern
  19. php+矩阵,PHP实现简单矩阵算法
  20. 有哪些不错的家装风格?极家整装怎么样

热门文章

  1. docker镜像制作、数据管理
  2. VC++调用大漠插件
  3. 推荐几款代码检查工具,淘宝开源代码质量检测工具
  4. VB.NET2010 编程实现Word双面打印
  5. bias tee电路设计-电容电感值
  6. 阿里、美团内部大数据资料!果然牛逼!
  7. java 日历_java的日历类(Calendar)详解
  8. 设备管理器里“SM总线控制器”、“其它PCI桥设备”驱动有问题
  9. Tecplot绘制图形(一维图形和非结构数据类型图形)
  10. vtk世界坐标系与屏幕坐标系的转换