PreparedStatement executeBatch with而不是insert trigger

时间:2018-06-13 09:19:32

标签: sql-server jdbc

我们有一个带有INSTEAD OF INSERT触发器的表。为简单起见,触发器将值复制到另一个表,并添加时间戳以查看触发器是否仅运行一次(这是强制条件)。 我们想插入数千行(5-10)并只触发一次触发器。 我碰到的问题是,即使我设置了autocommit,并使用executeBatch,触发器也会运行多次。 以下是保存的Java代码:

  @Transactional
  public void saveMultiInserBatch(List<BulkImport> importThis) throws SQLException {
    long start = System.currentTimeMillis();
    StringBuilder build = new StringBuilder("insert into interface.ui_test (description) values(?)");
    datasource.getConnection().setAutoCommit(false);
    PreparedStatement ps = datasource.getConnection().prepareStatement(build.toString());
    for (int i = 0; i < importThis.size(); i++) {
      ps.setString(1, importThis.get(i).getDescription());
      ps.addBatch();
    }
    ps.executeBatch();
    datasource.getConnection().commit();
    long end = System.currentTimeMillis();
    System.out.println("Insert time was: " + (end - start));
  }

插入后表中的值,触发器插入值:

    Multi Insert Batch0 2018-06-13 04:02:05.0424486
    Multi Insert Batch1 2018-06-13 04:02:05.1049570
    Multi Insert Batch2 2018-06-13 04:02:05.3705852
    Multi Insert Batch3 2018-06-13 04:02:05.3861983
    Multi Insert Batch4 2018-06-13 04:02:05.3861983
    Multi Insert Batch5 2018-06-13 04:02:05.3861983
    Multi Insert Batch6 2018-06-13 04:02:05.3861983
    Multi Insert Batch7 2018-06-13 04:02:05.3861983
    Multi Insert Batch8 2018-06-13 04:02:05.3861983
    Multi Insert Batch9 2018-06-13 04:02:05.3861983
    ...

从时间戳中可以看出,触发器多次运行。 什么可能导致这种情况?

0 个答案:

没有答案