「準備済みSQL命令でデータベースアクセスを効率化する」で紹介した「準備済みSQL命令」(PreparedStatement)は、「パラメータだけが異なる同一のSQL命令を繰り返し実行する場合」に便利ですが、まったく異なる複数のSQL命令を実行したいというケースでは、効果的なパフォーマンスを望むことはできません。
「ストアドプロシージャでデータベースアクセスを効率化する」で紹介した「ストアドプロシージャ」(CallableStatement)は、「複雑なSQL命令を実行する場合」には便利ですが、MySQLのようにストアドプロシージャをサポートしていない一部のデータベースサーバ(現在開発中のMySQL 5.0ではサポート予定)では利用することができません。また、開発者はデータベースサーバごとにストアドプロシージャの構文を学習する必要があるため、敷居の高さも否定できません。
では、もう1つの便利なテクニックとして、SQL命令のバッチ実行(executeBatchメソッド)を紹介します。これは、準備済みSQL命令やストアドプロシージャとは異なり、SQL命令をあらかじめ解析・コンパイルしておくことでデータベースアクセスの効率化を図るというものではありません。複数のSQL命令を実行する際に命令を1つ1つ順番に実行していくのではなく、いったん命令を蓄積しておき、後でまとめて実行するというテクニックです。こうすることにより、単発的に命令を発行するのに比べ、処理前後のオーバヘッドを軽減することができるので、実行効率を向上することができます。
解説
それでは、executeBatchメソッドを利用してbooksテーブルへのデータの登録・更新を行うサンプルプログラムを下記に示します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
サンプルプログラムを見ればわかるとおり、バッチ処理のロジックは、大まかに以下の2つの段階から構成されています。
- SQLコマンドをバッチ処理のスケジュールに追加(Statement#addBatchメソッド。赤字部分)
- バッチスケジュールに蓄積されたSQL命令を一括実行(Statement#executeBatchメソッド。緑字部分)
なお、addBatchメソッドによってバッチ処理リストに追加された一連のSQLコマンドは、clearBatchメソッドでクリアすることができます。
注意:サーブレットクラスの動作にはデプロイメント・ディスクリプタ(web.xml)への登録が必須です。web.xmlの設定については、連載:基礎から学ぶサーブレット/JSP「第11回 JSPとサーブレットの違いを明らかにする」を参照してください。
Copyright © ITmedia, Inc. All Rights Reserved.