|
|
 |
連載
JDBC
プリコンパイル |
|
1.プリコンパイルとは
SQL文のWHERE句などでシングルコーテーションで囲まれた文字列コードがある場合、
データベース側で、内部構造に合わせて解釈し、コンパイルされ、実行されます。
実行時にこれらの全ての工程が行われるということは、大量のループ文の中にこのようなSQL文がある場合にはかなりの負荷が掛かります。
そこでこのようなループ文の中では、コンパイル済みのSQL文を使うことでかなりの改善が可能となります。
SQL文全てでなく、問題となる文字列をパラメータ化しコンパイルしておくことをプリコンパイルといいます。
|
2.プリコンパイルの方法
通常SQL文を発行する場合はまず Statementオブジェクトを作成し、execute系メソッドを発行してきました。
プリコンパイルを行う場合は prepareStatementメソッドでSQL文を引数として渡し、PreparedStatementオブジェクトを作成します。
この時にパラメータ化する文字列部分は"?"で表現しておきます。"?"は複数箇所で表現可能です。
次に、問題となるループの中で、"?"が出現した順に、その値のデータ型に応じた setXXXXメソッドで実際の値を設定します。
setXXXXメソッドは通常の読み込み時の getXXXXメソッドに対応しています。
後はPreparedStatementオブジェクトのexecute系メソッドを同じループ内で発行します。
通常では実行時にSQL文をループ内で渡すので、負荷が掛かります。
|
3.プリコンパイルの例
データベースの接続後のプリコンパイルの例を下記に示します。
この場合は2万件のデータをユーザIDだけ連番で作成し、名前は同一の"氏名"として後で修正する例です。
SQLの引渡し場所に注意して下さい。
|
 |
| |
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO DB0201 (ID, name) VALUES (?, ?)");
int i=0;
while (i<20000) {
stmt.setInt(1, i); // 1は1個目の?
stmt.setString(2, "氏名"); // 2は2個目の?
int cnt = stmt.executeUpdate(); // 引数はなし
i++;
}
|
|
| プリコンパイルの例 |
|
| |
|
|