1

SELECT GEN_ID(TABLE,1) FROM MON$DATABASEfromを使用PreparedStatementして、複数のテーブルで使用される ID を生成しています。

私は s 個のバッチで多数のINSERTsを実行する予定PreparedStatementで、Firebird から一度に多くの新しい ID を取得する方法を探しています。

INSERTJavaコードでこのIDを使用して別の時間に他のテーブルを使用する必要があるため、トリガーを実行することは問題外のようです。また、getGeneratedKeys()(私の?) Firebird JDBCdriver にはまだバッチが実装されていないようです。

4

2 に答える 2

4

ここでは記憶から回答していますが、Quicken ファイルから Firebird データベースに一連のトランザクションをロードする必要があったことを覚えています。配列にトランザクションをロードし、say iCount という名前の変数に数値を設定しました。次に、RDB$DATABASE から SELECT GEN_ID(g_TABLE, iCount) を実行しました。これにより、次の ID が得られ、挿入するレコードの数だけジェネレーターがインクリメントされました。次に、トランザクションを開始し、配列をステップ実行してレコードを次々に挿入し、トランザクションを閉じました。私はこれがどれほど速く進んだかに驚きました。当時、私は約 28,000 件のトランザクションを扱っていたと思いますが、その時間は数秒程度でした。このようなものがうまくいくかもしれません。

于 2013-02-14T16:43:22.587 に答える
1

jrodenhiが言うように、を使用して値の範囲を予約できます

SELECT GEN_ID(<generator>, <count>) FROM RDB$DATABASE

これにより<count>、以前に生成されたキーよりも高い値が返されるため、(value - count, value](排他的、包括的(を意味する)からのすべての値を使用できます。]ジェネレーターの現在の値が10であるとすると、呼び出しGEN_ID(generator, 10)は20を返し、IDに11...20を使用できます。

これは、通常、ジェネレーターを使用してテーブルのIDを生成し、ジェネレーターを使用せずに独自のIDを作成するアプリケーションはないことを前提としています。

お気づきのgetGeneratedKeys()とおり、Jaybird2.2.xのバッチには実装されていません。このオプションのサポートは、Jaybird3.0.0で利用可能になります。JDBC -452を参照してください。

他のデータベースもターゲットにしていない限り、(Jaybirdで)バッチ更新を使用することによる実際のパフォーマンス上の利点はありません。Firebirdは更新バッチをサポートしていないため、Jaybirdの内部実装は、ステートメントを準備して自分で繰り返し実行するのと基本的に同じです。これをFirebird4に追加する計画があるため、これは将来変更される可能性があります。

開示:私はJaybird開発者の1人です

于 2013-02-15T06:38:29.920 に答える