JDBC中的批量插入需要很长时间

时间:2016-08-10 13:32:58

标签: java jdbc bulkinsert

我试图在MSSQL中通过jdbc连接批量插入10K记录,批量插入需要大约18到20秒。我想在不到3秒的时间内插入。有没有办法快速插入。

我的代码在下面给出

public void BatchInsert() {
    PreparedStatement pStmnt = null;
  try {
     final int batchSize = 1000;
     int count = 0;
     Connection con = createConnection();
     long end = System.currentTimeMillis();
     System.out.println("connection creation time :: " + (end - start));
     start = System.currentTimeMillis();
     pStmnt = con.prepareStatement("insert into testtable values(?)");
     for (int i = 1; i <= 10000; i++) {
        pStmnt.setInt(1, i);
        pStmnt.addBatch();

       if (++count % batchSize == 0) {
          pStmnt.executeBatch();
       }
     }
     pStmnt.executeBatch(); // insert remaining records
     end = System.currentTimeMillis();
     System.out.println("total insert time :: " + (end - start));
 } catch (SQLException e) {
     e.printStackTrace();
 } finally {
     try {
       pStmnt.close();
     } catch (SQLException e) {
       e.printStackTrace();
     }
 }
    }

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

到目前为止,我认为您在数据库表中使用了更多索引。这就是为什么花费更多时间的原因。因此,在插入案例时,首先需要以某种方式停止索引(可能删除并重新创建或删除不必要的索引)。

出于操作目的,您可以从testtable删除所有索引并运行批处理。希望您的插入时间最短。

资源链接:

  1. More indexes, slower INSERT - Use The Index, Luke!
  2. Fundamentals: Improving Insert and Update Performance by Dropping Unused Indexes.
  3. UPDATE:

    1. 在执行INSERT之前,请禁用“触发器”并删除“外部” 密钥。
    2. INSERT设置通常由Trigger设置的字段,和 确保FK列的值有效。
    3. 重新启用触发器,并使用NOCHECK重新创建外键。
    4. 信用转到@RBarryYoung

      资源链接:

      1. SQL Server INSERT into huge table is slow

答案 1 :(得分:0)

如果您的连接默认为AutoCommit模式,那么您可以通过

获得性能方面的显着改善
con.setAutoCommit(false);

在进入addBatch循环之前,然后执行

con.commit();

在最终executeBatch之后。