jdbc批量插入2

   在實際的開發過程中,特別是大型的分佈式應用系統,往往會涉及到大批量的數據。那麼在測試的時候就需要準備足夠多的數據以便進行測試。
   爲了提高插入數據的效率,我們可以利用MySql的批量插入數據能力。其實,從本質來說也就是取消JDBC中事務的自動提交,改爲手動提交。
   如果沒有關閉JDBC事務的自動提交,那麼JDBC驅動會在每次執行了一條SQL語句之後,自動提交,並且關閉連接。而我們知道打開數據庫連接是非常耗資源的,而且有些JDBC框架還會限制數據庫操作的頻率。這種情況下,如果採用單調數據插入效果非常不好。
   解決的方法之一,就是關閉JDBC事務的自動提交,改爲手動提交。我們可以記錄SQL語句的執行次數,然後當達到某一個值的時候,比如10w次的時候,手動提交一下事務,然後關閉並重新開始數據庫連接。再進行下一批數據局的插入或者更新。
   這種方法非常適合於準備測試環境當中的大批量數據。在運行程序過程中,會碰到JVM拋出內存不足的異常,這個時候可以調大內存,或者減少每批數據的數據量來解決。
   以下代碼僅供參考,在下面代碼中,每批的數據庫量爲1w條記錄。不同JDBC版本支持的批量插入的數據量不同,爲了謹慎起見,可以先改小一點,然後慢慢提高。
Java代碼
  1. @Test  
  2.     public void testInsertFollowRelation(){   
  3.         String db = "com.mysql.jdbc.Driver";   
  4.         String host = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK";   
  5.         String user = "abc";   
  6.         String passwd = "abc";   
  7.         Connection con = null;    
  8.            
  9.         try{   
  10.             Class.forName(db).newInstance();    
  11.         } catch (Exception e) {   
  12.             System.out.println("加載驅動失敗:" + db);   
  13.         }    
  14.            
  15.         long starTime = System.currentTimeMillis();   
  16.         try {    
  17.                         long startRowNum = 0;   
  18.             long count = 0;   
  19.             //使用事務插入,每10000條數據提交一下事務。   
  20.             //提高效率   
  21.             for(int i = 0; i < 10; i++){   
  22.                 BufferedReader reader = new BufferedReader(new FileReader(new File("E:\\test.txt")));   
  23.                 con = DriverManager.getConnection(host, user, passwd);    
  24.                 con.setAutoCommit(false);   
  25.                 PreparedStatement pstmt = con.prepareStatement("INSERT INTO test " +   
  26.                         "(id,info) " +   
  27.                         "VALUES(?,?,?,now())");    
  28.                                 String info = null;   
  29.                 while((info= reader.readLine()) != null){   
  30.                     pstmt.setLong(1, startRowNum);   
  31.                     pstmt.setLong(2, info);   
  32.                        
  33.                     pstmt.executeUpdate();   
  34.                     count++;   
  35.                                         startRowNum ++;   
  36.                     if(startRowNum % 10000 == 0){//如果數據條數達到10000條,則提交事務   
  37.                         con.commit();   
  38.                         con.close();   
  39.                         //重開鏈接   
  40.                         con = DriverManager.getConnection(host, user, passwd);    
  41.                         con.setAutoCommit(false);   
  42.                         pstmt = con.prepareStatement("INSERT INTO test " +   
  43.                         "(id,info) " +   
  44.                         "VALUES(?,?,?,now())");    
  45.                            
  46.                         System.out.println("數據量達到10000條,提交事務完成。");   
  47.                     }   
  48.                 }   
  49.                    
  50.                 reader.close();   
  51.             }   
  52.             long endTime = System.currentTimeMillis();   
  53.             System.out.println("共耗時:<" + new Float(((endTime-starTime)/1000)) + ">秒。插入了(" + count + ")條數據");   
  54.         } catch(Exception e){   
  55.             e.printStackTrace();   
  56.             try {   
  57.                 con.rollback();   
  58.             } catch (SQLException e1) {   
  59.                 e1.printStackTrace();   
  60.             }   
  61.         }   
  62.     }  
發佈了4 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章