与SQL Server一起使用时如何定期刷新dapper.net缓存

时间:2011-07-25 15:13:27

标签: c# sql-server-2005 tsql orm dapper

有人可以解释这意味着什么(来自Dapper.net网站)

限制和警告

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

我无法理解粗体表示的行。我正在使用SQL Server和c#client。

有人可以提供一些c#代码示例,这些代码会产生内存问题。谢谢

1 个答案:

答案 0 :(得分: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#代码示例,这些代码会产生内存问题。谢谢

在循环中做前者。留意你的记忆力增长。在循环中做后者。注意你的记忆力不会增长。