1

batchUpdateJDBCの機能を使用して、自動生成されたキーを持つテーブルに大量のデータを挿入します。JDBCは何も言っておらずbatchUpdategetAutogeneratedKeysデータベースに依存しない回避策が必要です。

私のアイデア:

  1. キーを手動で挿入してから使用する前に、データベースから次の配布されたシーケンスを何らかの方法で引き出します。しかし、JDBC にはgetTheNextFutureKeys(howMany). では、これを行うにはどうすればよいでしょうか。Oracle などでキーをプルすると、トランザクションも保存されますか? したがって、1 つのトランザクションだけが、同じフューチャー キーのセットをプルできます。

  2. トランザクション中にのみ有効な偽の ID を持つ余分な列を追加します。

  3. 他のすべての列をセカンダリ キーとして使用して、生成されたキーをフェッチします。これは実際には 3NF 準拠ではありません...

より良いアイデアはありますか、またはアイデア 1 を一般化した方法でどのように使用できますか?

4

3 に答える 3

2

一部回答

Oracle などでキーをプルすると、トランザクションも保存されますか?

はい、シーケンスから値を取得することはトランザクション セーフです。つまり、トランザクションをロールバックしても、DB から返されたシーケンス値はいかなる状況でも再度返されることはありません。

したがって、シーケンスから id-s をプリフェッチして、それらをバッチ挿入で使用できます。

于 2011-08-29T14:52:46.570 に答える
1

これに出くわすことはないので、少し掘り下げました。まず、生成された ID を JDBC ステートメントから取得する方法があります

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と組み合わせることができます

ただし、この組み合わせはかなり重要なようですが、このスレッドを参照してください。これを試してみることをお勧めします。成功しない場合は、シーケンスからのプリフェッチに戻ります。

于 2011-08-29T15:28:12.490 に答える
0

getAutogeneratedKeys()私が覚えている限り、バッチ更新でも動作します。

単一の値だけでなく、新しく作成されたすべての ID を含む ResultSet を返します。

ただし、これには、INSERT 操作中にトリガーを使用して ID を設定する必要があります。

于 2011-08-29T15:27:06.733 に答える