executebatch
BOSS交給了我一個任務,讀取文件,將文件中的數據以“|”為分割標志,將分割出來的字段一一對應數據庫里的字段插入里面。
1.前面的簡單,首先IO流讀取數據,然后將讀取出來的數據一條條遍歷,再分割一下完事。
上代碼:
public static void readTxtFile(String filePath) throws IOException, sqlException{
String encoding="UTF-8";
File file=new File(filePath);
inputstreamreader read = new InputStreamReader(new
fileinputstream(file),encoding);//考慮到編碼格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
List list =new ArrayList();
while((lineTxt = bufferedReader.readLine()) != null){
String[] temp=lineTxt.split("\\|");
String sqlValue="VALUES (";
for(int i=0;i<temp.length;i++) {
temp[i]=temp[i].trim();
if(i!=temp.length-1) {
sqlValue+="'"+temp[i]+"'"+",";
}else {
sqlValue+="'"+temp[i]+"'";
}
}
sqlValue+=")";
sqlValue= sqlValue.replace("null", "");
String sql=sqlValue;
list.add(sql);
}
read.close();
}
public static void main(String argv[]) throws IOException, SQLException{
String filePath = "E:\\緩存\\QQ緩存\\1023047818\\FileRecv\\part-00000";
readTxtFile(filePath);
}
2.難度就來了,傳統的更新語句肯定不行了,因為有17萬數據,一條一條插入會累死Ecilpse的,所以另外一種方法就出來了:executeBATch!這是個批量執行神器,比如我這種情況要一次執行數萬數十萬的數據的時候,每千條執行一次會極大提升效率。別的不說先上代碼:
private static void doexcuteBatch(List list) {
try {
try {
conn = DriverManager.getConnection(dburl, DBUSER, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printstacktrace();
}
statement pstmt = null;
class.forname(drive);
conn = DriverManager.getConnection(dburl, DBUSER, password);
conn.setAutoCommit(false);
pstmt = conn.createStatement();
for(int i=0;i<list.size();i++) {
pstmt.addBatch(list.get(i).toString());
if (i > 1 && (i+1) % 1000 == 0) {
long startTime = system.currenttimemillis();
pstmt.executebatch();
conn.commit();
pstmt.clearBatch();
System.out.println("提交:" + i);
System.out.println("executeBatch 執行使用了 :"+(System.currentTimeMillis() - startTime )/1000 + " 秒");
}
}
pstmt.executeBatch();
pstmt.close();
conn.commit();
}catch(Exception e) {
e.printStackTrace();
}
}
要注意的問題是1 conn.setAutoCommit(false);? ? ? ? ?要關閉自動提交
? ? ? ? ? ? ? ? ?2 pstmt = conn.createStatement();? ?要把ps放在循環外面,不然只會執行一條
?? ? ? ? ? ? ? ? ? ? ? 3??pstmt.clearBatch();? ? ? ? ? ? ? ? ? ? ? ? 每次執行后要將ps clear一下,防止程序卡死及重復提交
相關閱讀
最近碰到了doc文檔需要批量轉為docx的需求,手工轉效率太慢,經多方研究找到了一個很不錯的方法: 首先,打開一個空白word,按住ALT+F11,彈
淘寶關鍵詞指數是什么朋友比較迷惑的地方之一,很多賣家朋友可能不知道這個指數指的是什么意思,怎么批量查詢等等,其實這方面的信息,se
高分數據批量處理可以有下述5種選項。 MSS數據的批量正射校正 MSS數據批量正射校正和大氣校正 PAN 數據的批量正射校正 MSS與P
選品庫其實是指你把具有相同屬性的商品放置于一起,然后選擇性就會豐富很多,現在淘寶聯盟就有一個選品庫,大家知道淘寶聯盟選品庫怎么
Excel表格中取消超鏈接的方法非常簡單,我們只需選中鏈接后單擊右鍵,然后在彈出菜單中選擇“取消超鏈接”即可。但如果表