19

有人可以解释一下这是什么意思(来自 Dapper.net 网站)

限制和警告

Dapper 缓存有关它运行的每个查询的信息,这允许它快速实现对象并快速处理参数。当前实现将此信息缓存在 ConcurrentDictionary 对象中。它存储的对象永远不会被刷新。如果您在不使用参数的情况下即时生成 SQL 字符串,您可能会遇到内存问题。我们可以将字典转换为 LRU 缓存。

我无法理解粗体线的含义。我正在使用 SQL Server 和 c# 客户端。

有人可以提供一个会产生此内存问题的 c# 代码示例。谢谢你

4

1 回答 1

47

如果您在不使用参数的情况下即时生成 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# 代码示例。谢谢你

只需循环执行前者。看着你的记忆增长。循环执行后者。注意你的记忆不要增长。

于 2011-07-25T15:26:12.257 回答