3

PreparedStatement のオブジェクトを作成し、そのようなクエリを実行するとき

PreparedStatement stmt=con.prepareStatement("select * from emp");  
ResultSet rs=stmt.executeQuery(); 

Statement はどのように再コンパイルされ、PreparedStatement はプリコンパイルされますか?

PreparedStatement オブジェクトを使用して、データが保存されているメモリ位置のデータベースからデータがフェッチされたときは?

4

2 に答える 2

2

JDBC エンジンに依存します。たとえば、MySQL の JDBC エンジンは、多くの場合、実際にはサーバー側の準備済みステートメントを作成しません ( MySQL のドキュメントこの SO の質問を参照してください)。そのような場合、PreparedStatementインターフェースはクエリとパラメーターの間の分離のみを提供し、明確さとインジェクション攻撃からの保護を提供します。を実行するたびにPreparedStatement、完全な形式の SQL クエリが送信され、MySQL サーバーが解析、最適化、および実行します。一方、一部のシステム (適切なオプションを備えた MySQL を含む - 2 番目のリンクを参照) は、「実際の」準備済みステートメントを使用します。つまり、一度だけ解析および最適化されます。

しかし、実際には、これはのメモリ特性を求めるようなものです。java.util.Listそれは完全に実装次第であり、したがって、一般的なインターフェイスに対して意味のある答えを出すことはできません。

于 2013-11-04T06:56:12.563 に答える
1

JDBC では、次の 3 つのことが常に行われます。

  1)Query creation.

  2)Query compilation.

  3)Query Execution.

PreparedStatement の場合、キャッシュ メモリが表示されるため、最初の 2 つの手順を再度実行する必要はありません。したがって、Statement の反対である PreparedStatement の場合、最後のステップのみが実行されます。

于 2013-11-04T06:57:17.590 に答える