SQL Serverでdapper.netキャッシュを定期的にフラッシュする方法

c# dapper orm sql-server-2005 tsql

質問

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

制限と警告

Dapperは、実行するすべてのクエリに関する情報をキャッシュします。これにより、オブジェクトを素早くマテリアライズし、パラメータを素早く処理できます。現在の実装は、この情報をConcurrentDictionaryオブジェクトにキャッシュします。格納するオブジェクトは決してフラッシュされません。 パラメータを使用せずに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ための異なった価値のそれのような問合せを書くたびにキャッシュされemail 。これはあなたの記憶を爆発させます。

後者は非常に優れています。それは注入攻撃を避ける。 dapperは一度キャッシュすることができます。 SQL Serverは実行計画を一度コンパイルしてキャッシュします。

すでにパラメータ化されたクエリを使用している必要があります(必須)。あなたがしていない場合は、あなたがやっていることをすべて落として、これを最優先にしてください。

誰かがこのメモリの問題を作成するC#コードのサンプルを提供していただけますか?ありがとうございました

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



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow