與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值。這會爆炸你的記憶。

後者非常優越。它避免了注入攻擊。 dapper可以緩存一次。 SQL Server將編譯執行計劃一次並緩存它。

您應該(命令性)已經使用參數化查詢。如果不是,請放棄您正在做的所有事情,並將其作為當務之急。

有人可以提供一個c#代碼示例,它會產生這個內存問題。謝謝

只需在循環中完成前者。留意你的記憶力增長。在循環中做後者。注意你的記憶不會增長。



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