1. 程式人生 > >java實現批量匯入資料到資料庫

java實現批量匯入資料到資料庫

這裡使用的是jdbc,下面貼出主要的程式碼,connection自己實現就可以了

Connection con = null;  
	       try{  
	           con = getConnection();    
	           /* 
	            * do update or insert. 
	            */  
	           int i = 0;  
	           //設定批量處理的數量             
	           int batchSize = 5000;       
	           preparedStatement = con.prepareStatement("insert into mysqltest (id,name) "
	                   + "values (?,?)");
	           // 關閉事務自動提交 ,這一行必須加上,否則每插入一條資料會向log插入一條日誌
	           con.setAutoCommit(false);
	           for (int j = 0; j < 50005; j++){
	               ++i;
	               preparedStatement.setInt(1, j);  
	               preparedStatement.setString(2, "name");  
	               preparedStatement.addBatch();  
	               if ( i % batchSize == 0 || i == batchSize) {
	            	   preparedStatement.executeBatch();
	                   con.commit();
	               }
	           }  
	        }catch(Exception e){  
	           if(con!=null){  
	               try {  
	                   con.rollback();  
	               } catch (SQLException e1) {  
	                   e1.printStackTrace();  
	               }  
	           }    
	        }finally{  
	           if(con!=null){  
	               try {
	            	   preparedStatement.close();
	                   con.close();  
	               } catch (Exception e) {  
	                   e.printStackTrace();  
	               }  
	           }  
	       }


注意問題:

可能執行程式碼後資料庫裡沒有更新資料,這個時候就看下有沒有commit,因為如果資料庫引擎是innodb, 不執行commit,資料不會更新;如果用的是myisam引擎,因為不支援事物,不執行commit,也會更新資料。

把資料庫連線con 設定成非自動提交事務,但沒有在執行出現異常的時候進行回滾。如果在執行更改資料表操作的時候出現異常,con既沒有提交也沒有回滾,被操作的表就會被鎖住(如果oracle資料庫就是行鎖),而這個鎖卻沒有機會釋放。有人會質疑,在執行con.close()的時候不會釋放鎖嗎?因為如果應用伺服器使用了資料庫連線池,連線不會被斷開。