如何有效地在表中插入约500.000个数据行

时间:2014-02-14 11:13:08

标签: java sql hibernate

我有大约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();
}

如何更有效地完成这项工作?

5 个答案:

答案 0 :(得分:5)

为什么你去手写SQL查询?如果你以这种方式编写sql,你肯定无法获得休眠的成果。

了解Batch Insert的示例代码Batch 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();

答案 1 :(得分:1)

最快的方法是始终使用DBMS的本机批量导入工具。

不要使用hibernate或java。

将数据转储为数据库理解的某种格式(最有可能在数据库的同一文件系统中)并使用您的DBMS本机导入工具。

答案 2 :(得分:0)

理想情况下,您应该使用批量插入。请参阅提供的示例here。这会在DB中一次性插入多个记录。

    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();

答案 3 :(得分: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;

答案 4 :(得分: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;