JAVA批量导入大文本数据(1G+)
发布时间:2018-07-30 08:30:07 阅读:356

这个不是造轮子,只是整理轮子,我在搜索引擎里,遇到的思路都是第一种思路(至少按照标题那个关键词搜索是这样的)所以我想发出来。

  • 一是如果遇到大神帮忙发现了方案一的问题与弊病,那就更好啦。
  • 二是让大家不会像我一样,只有一个思路。

这里感谢我的玉坤同学,提供给我第二种思路,还替我研究半天问题。

情景:最近工作中,需要处理1G+的文本文件简单处理后导入到数据库。

通用部分

方案都采用IO流中的Buffered系列,读取文件时候,采用了BufferedReader的输入流缓存。(搬来的,网上借鉴的)

// 文件路径
File file = new File("F:\demo\demo.txt");

// 输入流
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file))

// 30M的缓存
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),30*1024*1024);

一定记得flash()或者close(),否则会出现意想不到的小问题,我没有关闭输出流,就出现文件少写的现象。

方案一(排除)

用纯正的JDBC语句,选用带缓存性能比较好的prepareStatement,但是从文本中插入数据库到1W3行左右就出现了问题:
java.net.SocketException: No buffer space available (maximum connections reached?):与Communications link failure的错误
我上网搜索良久,网上给的建议是增加数据库连接数和超时时间,我采用了并不能彻底解决问题(不会在1W行死掉了,但是也没多写多少文件)

如果有解决办法,请慷慨相授,我会代替广大网友谢谢您!

方案二(目前采用)

并且猜测Navicat的'导入向导'也是利用此方法
利用Mysql的load data infile方法:

load data infile '文件全路径' replace into table 表名 character set utf8 fields terminated by '分割串' enclosed by '"' lines terminated by '\r\n' (字段列);

说实话,网上也有不少介绍Load data infile的。如果您能看懂这个,那这个绝对比网上找的长篇大论上手快。反正那些我看的是脑壳疼。

发表评论
使用 Nuxt 3 构建 | 部署于 Kubernetes | 托管于 狗云
Copyright © 2020-2024 | 网站已续航 1515 天