0

私はダッパーを初めて使用し、新しいプロジェクトで使用する予定です。それを読んだ後、私が抱えているかもしれない唯一の問題は ConcurrentDictionary のようです。

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

この問題を回避するにはどうすればよいですか? 誰かがそれをフラッシュする方法とタイミングを教えてくれるコードを見せてもらえますか?

4

1 に答える 1

2

上のコメントによると、オンザフライの例を次に示します。

var builder = new StringBuilder();
builder.AppendLine("SELECT Foo FROM Bar");
if (fisrtName != null || lastName != null)
    builder.AppendLine("WHERE");
if (firstName != null)
    builder.AppendLine("    Bar.FirstName = @Firstname");
if (firstName != null && lastName != null)
    builder.Append(" AND");
if (lastName != null)
    builder.AppendLine("    Bar.LastName = @LastName");
var sql = builder.ToString();

ご覧のとおり、dapper が実行する実際の SQL は、firstNameand/orlastNameが null であるかどうかによって異なります。両方がヌルの場合、1 つの SQL 文字列を取得します。onlyfirstNameが null でない場合は、別のものを取得します。onlylastNameが null でない場合は、さらに別のものを取得します。最後に、両方が null でない場合は、4 番目の順列を取得します。

これが「オンザフライ」の意味です。dapper はこれらの一意の順列に基づいてキャッシュします。より複雑なシナリオを考えると、非常に多くの異なる順列になってしまうことが容易にわかります。そのうち、個別にキャッシュする必要があります。

于 2012-05-04T20:22:39.903 に答える