【问题标题】:Java JDBC - Multiple prepared statement bulk insertJava JDBC - 多个准备好的语句批量插入
【发布时间】:2011-11-03 23:18:19
【问题描述】:

使用 JDBC (Oracle) 我需要在两个表中的每一个中插入大约一千行。像这样的:

"INSERT INTO TABLE_A (A_ID, A_NAME, A_LAST_NAME) VALUES (MY_SEQUENCE.NEXTVAL, ?, ?)";
"INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (MY_SEQUENCE.CURRVAL, ?)";

问题是两个表是通过公共顺序连接的,所以语句的顺序很重要。

如果我只有一张桌子,那就很容易了。在那种情况下,我使用了代码:

String insert = "Insert into TABLE_A(A_ID, A_NAME, A_LAST_NAME) values(MY_SEQUENCE.NEXTVAL, ?, ?)";
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(insert);
for(MyObject obj : myCollection) {
    ps.setString(1, obj.getName());
    ps.setString(2, obj.getLastName());
    ps.addBatch();
}
ps.executeBatch();
conn.commit();
ps.close();

但是这种方法只能使用一个准备好的语句,因此只能使用一个插入。我该如何解决这个问题?

【问题讨论】:

    标签: java jdbc prepared-statement


    【解决方案1】:

    你可以试试

    PreparedStatement ps = conn.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS);
    ...
    ps.executeBatch();
    

    然后

    ResultSet rs = ps.getGeneratedKeys();
    ps = conn.prepareStatement("INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (?, ?)");
    
    for ( int counter =0;rs.next(); counter++ ) { 
      ps.setInt(1,rs.getInt(0));
      ps.setString(2, myCollection.get(counter).getDescription());
      ps.addBatch();
    }
    ...
    

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您是否对 NEXTVAL 和 CURRVAL 有疑问,因为 CURRVAL 可能会因其他数据库的使用而改变? 如果是这样,您可以将代码更改为以下顺序:

      currentNextVal = select NEXTVAL
      INSERT into table_a with currentNextVal as the id
      INSERT into table_b with the same currentNextVal 
      

      我是否正确理解了您的问题?

      【讨论】:

      • 部分你是对的,但更复杂的问题是在 JAVA 中一个接一个地执行两个插入语句大约 1000 次,以便一个表中的每一行对应另一个表中的一行(A_ID = B_ID )。如果它只是一个插入,我们可以使用 addBatch() ,如我在示例中所示,这将提高性能。但似乎在 java 中使用两个准备好的语句是不可能的,这可能会导致性能问题。
      • 如果您使用我的伪代码中的相同“currentNextVal”,您将实现它。您不必分批执行,尽管您可以分 2 批执行...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2016-03-07
      相关资源
      最近更新 更多