2011-07-25 4 views
19

は、誰かが(Dapper.netのウェブサイトから)この手段SQL Serverで使用する場合どのように定期的にフラッシュdapper.netキャッシュをする

制限とは

Dapperのは、それが実行するすべてのクエリについての情報をキャッシュする注意事項どのような説明していただけますこれにより、オブジェクトを素早く実体化し、パラメータを素早く処理できます。現在の実装は、この情報をConcurrentDictionaryオブジェクトにキャッシュします。格納するオブジェクトは決してフラッシュされません。 パラメータを使用せずにSQL文字列を生成している場合、メモリの問題が発生する可能性があります。辞書をLRUキャッシュに変換することがあります。

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

誰かがこのメモリの問題を引き起こすサンプルコードを教えてください。ありがとう

答えて

45

パラメータを使わずにオンザフライで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は実行計画を一度コンパイルしてキャッシュします。

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

このメモリの問題を引き起こすサンプルコードを教えてもらえますか?ありがとうございます

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

+0

ありがとうございました。クリスタルクリア。 – Gullu

+0

これ以上の投票はできません!!!! – Kerby

+0

@jason非常にクールです。情報をありがとう。 – loneshark99

関連する問題