SQL Serverで使用したときにDapper.netキャッシュを定期的にフラッシュする方法
-
26-10-2019 - |
質問
誰かがこれが何を意味するのかを説明してもらえますか(dapper.netウェブサイトから)
制限と警告
Dapperは、実行するすべてのクエリに関する情報をキャッシュします。これにより、オブジェクトを迅速に実現し、パラメーターをすばやく処理できます。現在の実装は、この情報を同時判決オブジェクトにキャッシュします。保存するオブジェクトは決して洗い流されません。 パラメーターを使用せずにSQL文字列をその場で生成している場合、メモリの問題にヒットする可能性があります。 辞書をLRUキャッシュに変換する場合があります。
太字のラインが何を意味するのか理解できません。 SQL ServerとC#クライアントを使用しています。
誰かがこのメモリの問題を作成するC#コードのサンプルを提供してください。ありがとうございました
解決
パラメーターを使用せずにSQL文字列をその場で生成している場合、メモリの問題にヒットする可能性があります。
あなたはこれを行うことができます:
cmd.CommandText = "SELECT email, passwd, login_id, full_name " +
"FROM members " +
"WHERE email = '" + email + "'";
またはあなたはこれを行うことができます:
string s = "SELECT email, passwd, login_id, full_name " +
"FROM members WHERE " +
"email = @email";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@email", email);
後者はパラメーター化されています。一度キャッシュされます。前者はパラメーター化されていません。そのようなクエリを別の値で書くたびにキャッシュされます email
. 。これはあなたの記憶を爆発させます。
後者は非常に優れています。注射攻撃を回避します。ダッパーは一度キャッシュできます。 SQL Serverは、実行計画を一度コンパイルしてキャッシュします。
(必須)既にパラメーター化されたクエリを使用している必要があります。そうでない場合は、していることすべてをドロップし、これをすぐに優先します。
誰かがこのメモリの問題を作成するC#コードのサンプルを提供してください。ありがとうございました
前者をループで行うだけです。あなたの記憶が成長するのを見てください。後者をループで行います。あなたの記憶が成長しないのを見てください。