这个不是造轮子,只是整理轮子,我在搜索引擎里,遇到的思路都是第一种思路(至少按照标题那个关键词搜索是这样的)所以我想发出来。一是如果遇到大神帮忙发现了方案一的问题与弊病,那就更好啦。
二是让大家不会像我一样,只有一个思路。
这里感谢我的韩漂亮同学,提供给我第二种思路,还替我研究半天问题。情景:最近工作中,需要处理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的。如果您能看懂这个,那这个绝对比网上找的长篇大论上手快。反正那些我看的是脑壳疼。