3

jdbcで更新をバッチ処理しています

ps = con.prepareStatement("");
ps.addBatch();
ps.executeBatch();

しかし、バックグラウンドでは、prostgresドライバーがクエリを少しずつデータベースに送信しているようです。

org.postgresql.core.v3.QueryExecutorImpl:398

 for (int i = 0; i < queries.length; ++i)
            {
                V3Query query = (V3Query)queries[i];
                V3ParameterList parameters = (V3ParameterList)parameterLists[i];
                if (parameters == null)
                    parameters = SimpleQuery.NO_PARAMETERS;

                sendQuery(query, parameters, maxRows, fetchSize, flags, trackingHandler);

                if (trackingHandler.hasErrors())
                    break;
            }

それをスピードアップするために彼に1000回送信させる可能性はありますか?

4

1 に答える 1

9

AFAIK はfe/be プロトコルのサーバー側のバッチ処理ではないため、PgJDBC は使用できません。. 更新:まあ、私は間違っていました。PgJDBC (9.3 の時点で正確)は、生成されたキーを取得する必要がない場合、クエリのバッチをサーバーに送信します。個々のクエリの後にサーバーと同期することなく、一連のクエリを送信バッファーにキューに入れるだけです。

見る:

生成されたキーが要求された場合でも、拡張クエリ プロトコルを使用して、毎回クエリ テキストを送信する必要がなく、パラメータだけを送信する必要があります。

率直に言って、JDBC のバッチ処理は、いずれにしても優れたソリューションではありません。アプリ開発者にとっては使いやすいですが、サーバーはすべてのステートメントを個別に実行する必要があるため、パフォーマンスは最適ではありませ

自動コミットがオンの場合、各ステートメントがコミットをトリガーするため、パフォーマンスは絶対に悲惨なものになります。自動コミットをオフにしても、ラウンドトリップの遅延をなくすことができたとしても、多くの小さなステートメントを実行してもそれほど高速ではありません。

多くの単純なUPDATEs のより良い解決策は次のとおりです。

  • COPYTEMPORARYまたはUNLOGGEDテーブルへの新しいデータ。と
  • コピーされたテーブルに対してを使用UPDATE ... FROMUPDATEJOIN

COPY については、PgJDBC ドキュメントサーバー ドキュメントCOPYドキュメントを参照してください。

多くの場合、アプリがこれらすべての個々の をまったく送信する必要がないように、微調整することが可能ですUPDATE

于 2012-09-28T23:15:21.903 に答える