19

誰かがこれが何を意味するのか説明してもらえますか (Dapper.net Web サイトから)

制限事項と注意事項

Dapper は、実行するすべてのクエリに関する情報をキャッシュします。これにより、オブジェクトをすばやく具体化し、パラメーターをすばやく処理できます。現在の実装では、この情報を ConcurrentDictionary オブジェクトにキャッシュします。格納されているオブジェクトがフラッシュされることはありません。パラメータを使用せずにオンザフライで SQL 文字列を生成している場合、メモリの問題が発生する可能性があります。辞書を LRU キャッシュに変換する場合があります。

太字の行が何を意味するのか理解できません。SQL Server と c# クライアントを使用しています。

このメモリの問題を引き起こす C# コードのサンプルを教えてください。ありがとうございました

4

1 に答える 1

47

パラメータを使用せずにオンザフライで 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。これはあなたの記憶を爆発させます。

後者は非常に優れています。インジェクション攻撃を回避します。dapper は一度キャッシュできます。SQL Server は、実行計画を一度コンパイルしてキャッシュします。

(必須)すでにパラメータ化されたクエリを使用している必要があります。そうでない場合は、今していることをすべてやめて、これを当面の優先事項にしてください。

このメモリの問題を引き起こす C# コードのサンプルを教えてください。ありがとうございました

前者をループで実行するだけです。あなたの記憶が成長するのを見てください。後者をループで実行します。あなたの記憶が成長しないように注意してください。

于 2011-07-25T15:26:12.257 に答える