最近須要將四個txt文件將近兩千萬的的數據從txt中讀出並進行相應的處理入到數據庫中,在實際操做中發現PreparedStatement的批處理方法和非處理方法效率相差極大,批量提交其中一個八百萬的文本不到五分鐘就入庫完畢,非批量提交的方法須要兩個多小時,在選擇批量處理的方法時,遇到了java.lang.OutOfMemoryError: Java heap space問題,剛開始覺得myeclipse內存設置過小,修改後問題仍是沒有解決,最後發現是一次性向命令列表中添加數量過多的sql語句, 形成outOfMemory錯誤. 故修改成每次提交後需調用clearBatch()方法進行清空。經過處理這個問題,感受之後解決問題,不能太着急了,解決問題的思路決定了你所作的工做,前期花費一些時間選擇一個最優的方法可以節省大量的時間。java
參考代碼以下:sql
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); eclipse
//需將變量清空
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();
}
}
}
}編碼