2014-02-14 43 views
0

我有大約500.000行數據要插入到一個表中。如何在表中高效地插入大約500.000個數據行

我目前將他們一次一個(我知道這是不好的)這樣的:

道方法:

public static final String SET_DATA = "insert into TABLE (D_ID, N_ID, VALUE, RUN_ID) " + "values (?, ?, ?, ?)"; 

public void setData(String dId, String nId, BigDecimal value, Run run) throws HibernateException { 
    if (session == null) { 
     session = sessionFactory.openSession(); 
    } 

    SQLQuery select = session.createSQLQuery(SET_DATA); 
    select.setString(0, dId); 
    select.setString(1, nId); 
    select.setBigDecimal(2, value); 
    select.setLong(3, run.getRunId()); 

    select.executeUpdate(); 
} 

我該怎麼做更有效?

+0

您正在使用什麼數據庫算偉大呢? – 2014-02-14 11:13:58

+0

我以前遇到過這種情況,我開始知道ETL工具可以提供幫助。 – Zeus

回答

5

爲什麼你去手寫的SQL查詢?如果你正在以這種方式編寫sql,那麼你肯定沒有獲得休眠的成果。

瞭解了Batch InsertBatch Insert示例代碼,

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 
0

理想情況下,您應該使用批量插入。參考提供的示例here。這可以一次性在數據庫中插入多條記錄。

dbConnection.setAutoCommit(false);//commit trasaction manually 

    String insertTableSQL = "INSERT INTO DBUSER" 
       + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
       + "(?,?,?,?)";    
    PreparedStatement = dbConnection.prepareStatement(insertTableSQL); 

for(int i=0;i<500000;i++){ 
    preparedStatement.setInt(1, 101); 
    preparedStatement.setString(2, "mkyong101"); 
    preparedStatement.setString(3, "system"); 
    preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
    preparedStatement.addBatch(); 
}  
    preparedStatement.executeBatch(); 

    dbConnection.commit(); 
1

,最快的方式是始終使用DBMS的本機批量導入工具。

不要爲此使用hibernate或java。

將數據轉儲爲您的數據庫理解的某種格式(最可能與數據庫的文件系統相同)並使用DBMS本機導入工具。

0

1.Solution

StringBuilder sb = new StringBuilder(); 
     sb.AppendLine("insert into Table_Name (column1, column1, column1 , column1) values "); 
     foreach (var item in req) 
     { 
      sb.AppendFormat("({0},{1},{2},'{3}'),", 
       item.val1, item.val2, item.val3, item.val4); 
     } 
     sb = sb.Remove(sb.Length - 1, 1); 
     ExecuteNonQuery(sb.ToString()); 
     return true; 
0

如果記錄1000

   StringBuilder sb = new StringBuilder(); 

     foreach (var item in req) 
     { 
      sb.AppendLine("insert into Table_Name(column1, column1, column1 , column1) values "); 
      sb.AppendFormat("({0},{1},{2},'{3}') ;", 
      item.val1, item.val2, item.val3, item.val4); 
     } 
     sb = sb.Remove(sb.Length - 1, 1); 
     ExecuteNonQuery(sb.ToString()); 
     return true; 
相關問題