1

私のアプリケーションには、別のコンポーネントからオブジェクトを受け取り、それらを MySQL DB に挿入するコンポーネントがあります。現在、私はオブジェクトをバッファリングしており、たまに(数秒)オブジェクトがバッチを使用して(休止状態ではなくJDBCを使用して)DBに挿入されます。

このオブジェクトを 2 つのオブジェクトに分割し、次に 2 つのバッファに分割し、最後にそれらを 2 つの異なるテーブルに挿入したいと思います。

私が最初に考えたのは、MySQL 自動生成 ID を使用して、テーブル内の 2 つのサブオブジェクトを (外部キーとして) 結びつけることでした。

私の問題は、「子」オブジェクトを挿入するときに、「父」オブジェクトの自動生成 ID をどのように知ることができるかということです。

私のアイデアは次のとおりです。

  1. オブジェクトを分割する前に独自の ID を生成し、MySQL の自動生成 ID を使用せずに、ID を自分で DB に送信します。
  2. 最初のオブジェクトを挿入するストアド プロシージャを使用し、MySQL を使用します。LAST_INSERT_ID();

どう思いますか?

4

5 に答える 5

1

1 つの解決策は、この質問で行ったように、2 つのレコードを同じトランザクションに挿入することです。 JDBC: 同じトランザクションで作成された PK の外部キー

あれは:

  1. トランザクションを初期化します。
  2. オヤジ初挿入。
  3. 生成された父親 ID を取得します。
  4. 父親の ID を使用して、子の 2 番目の挿入を行います。
  5. トランザクションをコミットします。
于 2012-09-11T08:16:50.117 に答える
0

生成されたキーを取得するためのJDBCとの標準インターフェースはgetGeneratedKeys()、ステートメントのメソッドを使用することです。例21.8を参照してください。Connector / J: MySQLサイトからを使用してAUTO_INCREMENT列の値を取得する

于 2012-09-11T17:13:07.990 に答える
0

たぶんこれは役に立ちます(プロシージャ内だけでなく、プレーンSQLでもLAST_INSERT_ID()を使用できます)。http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.htmlも参照してください

INSERT INTO foo (auto,text) VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)  VALUES(LAST_INSERT_ID(),'text');  # use ID in second table

OPがINSERTを別々のスレッドで実行する場合、IDを事前に割り当てる必要があります。シーケンスを使用して一意のIDを安全に選択できます(MySQL情報関数も参照)。

  • シーケンスカウンターを保持するテーブルを作成し、初期化します。

    mysql> CREATE TABLEシーケンス(id INT NOT NULL);

    mysql> INSERT INTO sequence VALUES(0);

  • この表を使用して、次のようなシーケンス番号を生成します。

    mysql>UPDATEシーケンスSETid= LAST_INSERT_ID(id + 1);

    mysql> SELECT LAST_INSERT_ID();

于 2012-09-11T08:14:19.430 に答える
0

どちらのアプローチも有効です。
Java のアプローチは、より DB に依存しないため、データベースの切り替えや複数の DB ベンダーのサポートが容易になる場合があります。

于 2012-09-11T08:21:24.077 に答える
0

あなたの本質的な問題は、他のオブジェクトを保存する前に、あるオブジェクトのデータベースからの情報が必要なことです。

複合オブジェクトを、Place と Map という 2 つの小さなオブジェクトに分割するとします。

Place と Map を格納するために 2 つのバッファーが必要な場合、次の 3 つの方法があります。

  1. Place だけを store-buffer に入れます。Place が格納され、PK がデータベースから読み取られた場合にのみ、Map を他のストア バッファに配置します。

  2. Place と Map をそれぞれのストア バッファに入れます。マップが保存されようとしているときに、関連付けられている場所をチェックして、PK がまだ生成されているかどうかを確認します。ある場合は、マップを保存します。そうでない場合は、そのマップをスキップして次のマップを確認してください。

  3. Place を store-buffer に入れます。格納されたら、PK を読み取り、すぐに Map も格納します。これは明らかに 2 つのストア バッファを使用しません。

アプリケーションに他のオブジェクトがどのように格納されているかを見てください。確かに、データベースに格納される前に独自の ID を生成することはありません。確かに、それらを保存するために必要なすべての情報を取得する前に、それらをストア バッファーに入れようとはしません。したがって、私が推奨する行動方針は、オプション 1 または 3 です。

于 2012-09-11T09:07:06.883 に答える