Java JDBC-多准备语句大容量插入

Java JDBC-多准备语句大容量插入,java,jdbc,prepared-statement,Java,Jdbc,Prepared Statement,使用JDBC(Oracle),我需要在两个表中的每个表中插入大约1000行。大概是这样的: "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, ?)"; 问题是两个表都是通过公共序列连接的,所以语句的顺序很重要 如果我只有一张桌子,那

使用JDBC(Oracle),我需要在两个表中的每个表中插入大约1000行。大概是这样的:

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

但这种方法只适用于一个准备好的状态,因此只适用于一个插入。如何提供此问题的解决方案?

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

currentNextVal = select NEXTVAL
INSERT into table_a with currentNextVal as the id
INSERT into table_b with the same currentNextVal 
我正确理解你的问题了吗?

你可以试试

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


部分正确,但更复杂的问题是在JAVA中一个接一个地执行两个insert语句大约1000次,这样一个表中的每一行都将对应于另一个表中的一行(A_ID=B_ID)。若只是一次插入,那个么我们就可以使用addBatch(),正如我在示例中所示,这将提高性能。但是在java中使用两个准备好的语句似乎是不可能的,这可能会导致性能问题。如果使用我的伪代码中相同的“currentNextVal”,您将实现它。您不必在一个批次中执行,尽管您可以在两个批次中执行。。。
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();
}
...