プリペアドステートメント(つまり、プリコンパイルされたステートメント)を使用する場合、DBはこのステートメントを取得するとすぐにコンパイルしてキャッシュし、最後にコンパイルされたステートメントを同じステートメントの連続呼び出しに使用できるようにします。したがって、後続の呼び出し用にプリコンパイルされます。
通常、実行時に変数を提供するバインド変数でプリペアドステートメントを使用します。これで、プリペアドステートメントの連続実行で何が起こるか、以前の呼び出しとは異なる変数を提供できます。 DBの観点からは、ステートメントを毎回コンパイルする必要はなく、ラム時にバインド変数を挿入するだけです。だから速くなります。
プリペアドステートメントの他の利点は次のとおりです:-
1)SQLインジェクション攻撃からの保護
2)同じステートメントの連続呼び出しの高速化
仕組み:-
-
事前コンパイルはデータベースによって行われます。一部の単純なデータベースは、ステートメントをまったくプリコンパイルしません。他の人はprepareStatement呼び出しでそれをプリコンパイルするかもしれません、そしてさらに他の人はステートメントをコンパイルする(計画を作成する)ときにパラメータの値を考慮に入れて、ステートメントでexecuteが最初に呼び出されるときにそれを行うかもしれません。
-
プリコンパイルステートメントを実行するデータベースは通常それらをキャッシュするため、おそらくps1は再度コンパイルされません。一部のJDBCドライバー(Oracleなど)は、プリペアドステートメントをキャッシュするため、ps.close()が呼び出されたときに実際には閉じていません。
-
データベースは通常、何かがステートメントをキャッシュから削除するまでステートメントをキャッシュします。
詳細については、このwiki を参照してください。 リンク