dapper.net,如何刷新ConcurrentDictionary?

concurrentdictionary dapper

我是新手,並且計劃在我的新項目中使用它。閱讀之後,似乎我可能遇到的唯一問題是ConcurrentDictionary。

Dapper緩存有關它運行的每個查詢的信息,這使它能夠快速實現對象并快速處理參數。當前實現將此信息緩存在ConcurrentDictionary對像中。它存儲的對象永遠不會被刷新。如果您在不使用參數的情況下動態生成SQL字符串,則可能會遇到內存問題。我們可以將字典轉換為LRU緩存。

我該如何避免這個問題?有人可以告訴我一些代碼告訴我如何以及何時沖洗它?

一般承認的答案

根據評論頂部,這是一個即時的例子:

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將根據firstName和/或lastName是否為null而不同。如果兩者都為null,則會得到一個SQL字符串。如果只有firstName不為null,則會得到另一個。如果只有lastName不為null,則會得到另一個。最後,如果兩者都不為空,則得到第四個排列。

這就是“即時”的含義 - dapper將基於這些獨特的排列進行緩存,並且考慮到更複雜的場景,很容易看出你將如何最終得到許多不同的排列,所有這些都是其中需要獨立緩存。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因