2012-04-25 9 views
3

私の問題に関するいくつかのアドバイスをお願いしたいと思います。 私はいくつかの計算(マルチスレッドenvironement)を行い、テーブルにいくつかの挿入を行うバッチを持っています。 バッチインサートのようなことをしたいのですが、いったんクエリを取得すると、たとえば1000クエリが待ってからバッチインサートを実行します(1つずつ実行しない)。java jdbcデザインパターン:多くのインサートを扱う

これにデザインパターンがあるかどうかは疑問でした。 私は心の中で解決策を持っているが、それは少し複雑だ:

  • は、クエリ

  • リスト(文字列および/または文)

  • に追加されます方法を構築リストは1000件

問題があるまで

  • は実行されません:どのように私は終わりを扱うのですか? 最後の999のクエリは、私が1000になることはないので、いつ実行するのですか? どうすればよいですか?

    私は、5分ごとに目を覚まし、リスト内の項目の数を確認するスレッドを考えています。彼が2回起きて数が同じ場合は、既存のクエリを実行します。

    もっと良いアイデアはありますか?

  • 答えて

    2

    データベースドライバは、バッチ挿入をサポートする必要があります。 See this.

    サービスとデータベースの間の通信が多すぎるため、システムがネットワークトラフィックを渋滞させていることを確認しましたか?もしそうでなければ、あなたがそれが必要であると確信するまで、私はバッチ処理について心配しないでしょう。

    あなたの計画では、5分ごとに確認したいと言います。それは永遠です。 5分で1000個のアイテムを取得する場合は、バッチ処理は必要ありません。それは~3秒です。

    バッチ処理を行うと仮定すると、プロセスは2秒ごとに起動し、キューに入っているものはすべてコミットします。 5分待たないでください。それは0行をコミットするかもしれない、それは10をコミットするかもしれません...誰が気に...このアプローチでは、任意のしきい値が満たされていないことを心配する必要はありません。

    私は挿入物が一度に1つずつ来ると仮定しています。あなたの入ってくるデータが一度にn個入ってくるなら、挿入が何回起こっても、すべての要求をコミットするだけです。あなたのメッセージが何らかのメッセージングシステムとして入ってくるなら、それはとにかく非同期なので、バッチ処理について心配する必要はありません。負荷が高い場合、受信メッセージは処理できる容量があるまで待機します。

    +0

    申し訳ありませんが、私はそれに言及するのを忘れました。私はMySQLデータベースを使用しています。 –

    +0

    http://dev.mysql.com/doc/refman/5.5/en/insert.html。独自のバッチインサートを作成できます。私はjbdcドライバがあなたのためにそれを処理する必要があると思っています。 – hvgotcodes

    +0

    hvgotcodesあなたのアイデアを悪くしていない:すべてのx個のアイテムではなく、2秒ごとにコミットする。 –

    0

    すべての項目が追加されたことを確認するために呼び出されるAPIにcommit種類のメソッドを追加します。また、最適なバッチサイズは、20〜50の範囲内のどこかにあります。その後、潜在的な利益は、ますます多くの陳述に必要な簿記によって上回っています。明示的には言及していませんが、JDBCで専用のバッチAPIを使用する必要があります。あなたは多くの作家を追跡する必要がある場合は

    は、独自のスレッドでそれぞれが、その後、あなたはまた、方法のbegin種類をする必要があります、あなたが呼ばれた回数commitに比べて、それが呼び出された回数をカウントすることができます。参照カウントのようなもの。ゼロに達すると、ステートメントバッファをフラッシュすることができます。

    0

    これは最も驚くべきコンセプトです。私は多くの時間に直面しています。あなたの問題に応じて、バッチを作成していて、そのバッチには1000個以上のクエリがあります。しかし、繰り返し同じ方法で同じテーブルに挿入している場合。 TABLE1のVALUES INTO

    INSERT( '4'、 'インド')、(5 ''、 'オリッサ州')、(」 - :あなたはこのようなINSERTクエリを作ることができるこのような状況を回避するために

    (arraylist、listなど)内のすべての値を保持し、最後に上記のようなクエリを作成して一度挿入すると良いでしょう。 。

    また、あなたは、SQLトランザクションAPIを使用することができます。(コミット、ロールバックを、setTraction())など

    希望、それはあなたを助けるでしょう。 すべて最高です。

    関連する問題