PgJDBCには、バッチに関していくつかの制限があります。
-
すべての要求値とすべての結果は、メモリに蓄積する必要があります。これには、大きなblob/clobの結果が含まれます。したがって、空きメモリがバッチサイズの主な制限要因です。
-
PgJDBC 9.4まで(まだリリースされていません) 、生成されたキーを返すバッチは、すべてのエントリに対して常にラウンドトリップを実行します 、したがって、個々のステートメントの実行に勝るものはありません。
-
9.4でも、生成されたキーを返すバッチは、生成された値のサイズが制限されている場合にのみ利点を提供します。 単一の
text
、bytea
または制約のないvarchar
要求された結果のフィールドは、実行ごとにドライバーにラウンドトリップを強制します 。
バッチ処理の利点は、ネットワークのラウンドトリップが減少することです。したがって、DBがアプリサーバーに対してローカルである場合、意味ははるかに少なくなります。ネットワーク待機にかかる合計時間が急速に減少するため、バッチサイズが大きくなると収穫逓減が発生します。そのため、バッチをできるだけ大きくしようとしてストレスを感じることはあまりありません。
データを一括読み込みする場合は、COPY
の使用を真剣に検討してください。 代わりに、PgJDBCのCopyManager
を介したAPI 、PgConnection
を介して取得 インターフェース。これにより、CSVのようなデータをサーバーにストリーミングして、クライアント/サーバーのラウンドトリップをほとんど行わずに迅速な一括読み込みを行うことができます。残念ながら、これは非常に文書化されていません。メインのPgJDBCドキュメントにはまったく表示されていません。