3

JDBC を使用して複数のテーブルに挿入しようとしています。高速でなければならないので、使用したい方法PreparedStatementexecuteBatch方法です。テーブルは外部キー関係によって結合されます。

  • 最初のアイデアは使用することでしたgetGeneratedKeys()が、これは一部の JDBC ドライバーでは失敗します。たとえば、PostgreSQL。

  • 2 番目のアイデアは、SQL-currval(...) 関数を使用することでした。ただし、1 つのステートメントと他のステートメントに対して execute batch を呼び出さなければならない場合、すべてのキーが同じ値になります。したがって、この方法も失敗します。

  • JDBC は、セミコロンで区切られた挿入を受け入れません。

どうすればこれを達成できますか?

4

3 に答える 3

1

主に PostgreSQL を使用しているようです。PostgreSQL JDBC ドライバー バージョン8.4-701PreparedStatement#getGeneratedKeys()以降は完全に機能することを知っておくとよいでしょう。

キーを返すようにするには、次のようにステートメントを準備するだけです。

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

そのため、必要に応じてドライバーをアップグレードし、ステートメントの準備方法を修正してください。ちなみに、これは他の多くの JDBC ドライバーにも当てはまります。


まったく別の代替案は、プレーンな JDBC を完全に削除し、1 つ上の抽象化レイヤーに移動して、「古き良き」Hibernate または最新の JPA に飛び込むことです。これらは、生成されたキーなどをいじる必要のない、Java でのデータベース エンティティ処理の純粋なオブジェクト指向アプローチを提供します。すべて透過的に処理され、非常に幅広い DB 方言をサポートします。

于 2011-03-03T04:08:50.520 に答える
0

さて、これが私自身の答えです。

ベンダーが getGeneratedKeys() 関数を正しく実装できない限り、データベース固有のフォールバック オプションが必要です。

スポーツされていないデータベースのフォールバックが必要な場合、コードが非常に醜くなります。

Postgres 9.0 の回避策は次のとおりです。

  • 最初に大量のキーを生成します "SELECT nextval('public.\"table_column_seq\"') FROM generate_series(1,"+pollsize+")");
  • 次に、準備したすべてのバッチ ステートメントでこれらのキーを配布します。

その上で血まみれの一日を無駄にしました、そして私が得たのは醜い解決策だけです. JDBC は、ドライバーが実際にその期待に応えているかどうかをアプリの起動時にチェックする必要があります。

于 2011-03-02T18:10:12.420 に答える
0

コードを高速に実行する必要がある場合は、テーブルに挿入される値の配列を受け入れるストアド プロシージャ/関数を作成してみてください。

ここにがあります。

于 2011-03-02T16:44:38.327 に答える