Jdbc批量更新了良好的密钥检索策略

时间:2011-08-29 14:41:37

标签: database oracle jdbc auto-generate batch-updates

我使用JDBC的batchUpdate功能将大量数据插入到具有自动生成密钥的表中。因为JDBC没有说明batchUpdategetAutogeneratedKeys的任何内容,所以我需要一些独立于数据库的解决方法。

我的想法:

  1. 在插入之前以某种方式从数据库中提取下一个分发的序列,然后手动使用这些键。但是JDBC没有getTheNextFutureKeys(howMany)。那么怎么做呢?拉动钥匙,例如在Oracle还事务保存?因此,只有一个事务可以提取相同的未来密钥集。

  2. 添加一个虚假ID的额外列,该列只在交易期间有效。

  3. 使用所有其他列作为辅助键来获取生成的密钥。这实际上不是3NF符合......

  4. 是否有更好的想法或如何以一般化的方式使用创意1?

3 个答案:

答案 0 :(得分:2)

部分答案

  

拉动钥匙,例如在Oracle中还有事务保存吗?

是的,从序列中获取值是事务安全的,我的意思是即使您回滚事务,在任何情况下都不会再次返回DB返回的序列值。

因此,您可以从序列中预取id-s并在批量插入中使用它们。

答案 1 :(得分:1)

永远不要碰到这个,所以我潜入了它。 首先, 是一种从JDBC语句中检索生成的id的方法:

String sql = "INSERT INTO AUTHORS (LAST, FIRST, HOME) VALUES " +
               "'PARKER', 'DOROTHY', 'USA', keyColumn";

int rows = stmt.executeUpdate(sql, 
               Statement.RETURN_GENERATED_KEYS);

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
         ResultSetMetaData rsmd = rs.getMetaData();
         int colCount = rsmd.getColumnCount();
         do {
             for (int i = 1; i <= colCount; i++) {
                 String key = rs.getString(i);
                 System.out.println("key " + i + "is " + key);
             }
         }
         while (rs.next();)
} 
else {
         System.out.println("There are no generated keys.");
}

请参阅此http://download.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html#1000569

另外,理论上它可以与JDBC batchUpdate

结合使用

虽然,这种组合似乎相当重要,但请参阅此主题。 我很想尝试这个,如果你没有成功,就可以回到序列中的预取。

答案 2 :(得分:0)

据我记得,

getAutogeneratedKeys()也可以使用批量更新。

它返回一个带有所有新创建的ID的ResultSet - 而不仅仅是一个值。

但是这需要在INSERT操作期间通过触发器填充ID。