PDO準備文を使用後に解放する必要がありますか?そしてもしそうなら、どうですか?具体的には、私はMySQLについて質問しています - あなたはどうすればよいでしょうか、あなたはPDOでもDEALLOCATE PREPARE
に電話してください。 (編集:明確にするために、この質問はエミュレートされた準備について言及していませんが、実際の準備です)PDO準備文を解放する(DEALLOCATE PREPARE)
また、これは結果セット(大きな場合)を解放しますか?
説明:
私はこれが何を、いつ、unset($stmnt);
は異なるだろうfの場合を不思議に私を導いた
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
の線に沿ってコードを見たことがありますか?
マニュアルは、クエリを調製する場合
は、データベースは、分析コンパイル及び がクエリを実行するための計画を最適化することを示しています。 [...]準備された ステートメントを使用することにより、アプリケーションは analyze/compile/optimizeサイクルの繰り返しを回避します。
これは、ステートメントの割り当てを解除する必要がある傾向があり、MySQLには機能があります。だから、
- あなたは
DEALLOCATE PREPARE
を呼び出すことができますし、あなたはそれをどのように行うべき - ?
- 誰かが、mysql_とmysqli_の "free_result"と同じようにnullを設定する(または設定を解除する)ことを確認できますか?
- すぐに実行されるのですか、またはガベージコレクタが起動するのを待機していますか? (あなたが大量のメモリ使用量を持ち、スペースを必要としない限り)完全性については
、「free_result」とmysqli_()
のための「クローズ」機能を参照する別のSO questionは、文を解放することは、実際に時間を追加することを示唆しています。しかし、 "free_result"は、準備されたSQL文をキャッシュしておくこととは異なります。
エミュレートされた準備を特にオフにしていますか?デフォルトでは、プリペアドステートメントはドライバでエミュレートされ、リクエストの最後に(すべてがGCdの場合)解放されます。とにかくそれらを意図的に解放するのは何でしょうか?可能であれば、用意されたステートメントを再利用することで、パフォーマンスが向上します。ポイント3をアドレス指定するには、[ステートメントが破棄されたときにfree_resultが呼び出されます](http://lxr.php.net/xref/PHP_5_4/ext/pdo_mysql/mysql_statement.c#55)(未設定、リクエストの終了など) - テストなしでは、私はdtorsがすぐに呼び出されると信じています。 – Leigh
はい、私は準備をエミュレートしていません - 申し訳ありませんが、質問で明確にすべきでした(そうでなければ質問は無意味です)。なぜそれを解放するのですか?その接続には一度も使用されないステートメントがいくつか存在するため、それらも解放される可能性があります(最適化はキャッシュされません)。再利用された人は私が(もう必要がなくなるまで、それを解放する方法について同じ質問が適用されます)。 – Robbie