java读取txt文件批量入库

最近需要将四个txt文件将近两千万的的数据从txt中读出并进行相应的处理入到数据库中,在实际操作中发现PreparedStatement的批处理方法和非处理方法效率相差极大,批量提交其中一个八百万的文本不到五分钟就入库完毕,非批量提交的方法需要两个多小时,在选择批量处理的方法时,遇到了java.lang.OutOfMemoryError: Java heap space问题,刚开始以为myeclipse内存设置太小,修改后问题还是没有解决,最后发现是一次性向命令列表中添加数量过多的sql语句, 造成outOfMemory错误. 故修改为每次提交后需调用clearBatch()方法进行清空。通过处理这个问题,感觉以后解决问题,不能太着急了,解决问题的思路决定了你所做的工作,前期花费一些时间选择一个最优的方法能够节省大量的时间。

参考代码如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import fhs.dao.DataAccess;


public class CopyOfReadTxtUtilsYff { 
public static void main(String arg[]) { 
DataAccess da=null;
Connection conn=null;
PreparedStatement ps = null;
try { 
String encoding = "UTF-8"; // 字符编码(可解决中文乱码问题 ) 
File file = new File("g:/hlr_y.txt"); 
if (file.isFile() && file.exists()) { 
InputStreamReader read = new InputStreamReader( 
new FileInputStream(file), encoding); 
BufferedReader bufferedReader = new BufferedReader(read); 
String lineTXT = null; 
da=new DataAccess();
conn=da.getConnection();
long id=1L;
String acc_num="";
String ins="";
String prp1="";
String prp2="";
String prp3="";
String prp4="";
String prp5="";
String prp6="";
String prp7="";
String prp8="";
String prp9="";
String prp10="";
String prp11="";
String prp12="";
String hh="";
String sql="insert into temp_0730_yff1_gfq (ACC_NUM, INSTRUCTION, PRP1, PRP2, PRP3, PRP4, PRP5, PRP6, PRP7, PRP8, PRP9, PRP10, PRP11, PRP12, HH)" +
"values (?,?, ?,?,?,?,?,?, ?, ?,?,?,?,?,?)";
conn.setAutoCommit( false ); 
while ((lineTXT = bufferedReader.readLine()) != null) {
ps = conn.prepareStatement(sql);

//需将变量清空
acc_num="";
ins="";
prp1="";
prp2="";
prp3="";
prp4="";
prp5="";
prp6="";
prp7="";
prp8="";
prp9="";
prp10="";
prp11="";
prp12="";
hh="";
String str=lineTXT.toString().trim();
String[] s =str.split("\\|");
acc_num=s[0];
ins=s[1];
hh=s[s.length-1];
for(int i=2;i<s.length-1;i+=2){
if("1".equals(s[i])){
prp1=s[i+1];
}else if("2".equals(s[i])){
prp2=s[i+1];
}else if("3".equals(s[i])){
prp3=s[i+1];
}else if("4".equals(s[i])){
prp4=s[i+1];
}else if("5".equals(s[i])){
prp5=s[i+1];
} else if("6".equals(s[i])){
prp6=s[i+1];
}else if("7".equals(s[i])){
prp7=s[i+1];
}else if("8".equals(s[i])){
prp8=s[i+1];
} else if("9".equals(s[i])){
prp9=s[i+1];
}else if("10".equals(s[i])){
prp10=s[i+1];
} else if("11".equals(s[i])){
prp11=s[i+1];
}else if("12".equals(s[i])){
prp12=s[i+1];

}
id+=1;
ps.setString(1,acc_num);
ps.setString(2,ins);
ps.setString(3,prp1);
ps.setString(4,prp2);
ps.setString(5,prp3);
ps.setString(6,prp4);
ps.setString(7,prp5);
ps.setString(8,prp6);
ps.setString(9,prp7);
ps.setString(10,prp8);
ps.setString(11,prp9);
ps.setString(12,prp10);
ps.setString(13,prp11);
ps.setString(14,prp12);
ps.setString(15,hh);
ps.addBatch();
ps.addBatch();
if((id)%10000==0){//每一万条提交一次
ps.executeBatch();
ps.clearBatch();
conn.commit();
if (null==conn) { //如果连接关闭了 就在创建一个 为什么要这样 原因是 conn.commit()后可能conn被关闭 
conn = da.getConnection();; 
conn.setAutoCommit(false); 
}
id=0;//提交后ID从0开始


ps.executeBatch();
conn.commit();//提交最后剩余不足一万条数据
read.close(); 
System.out.println("读取完毕!"); 
}else{ 
System.out.println("找不到指定的文件!"); 

} catch (Exception e) { 
System.out.println("读取文件内容操作出错"); 
e.printStackTrace(); 
}finally{
try {
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

posted @ 2013-07-30 11:16  依稀远方  阅读(3933)  评论(0编辑  收藏  举报