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

本文关键字:刷新 dapper 缓存 net SQL 一起 Server | 更新日期: 2023-09-27 18:03:19

谁能解释一下这是什么意思(从Dapper.net网站)

限制和注意事项

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

我看不懂这一行黑体是什么意思。我使用SQL Server和c#客户端。

谁能给一个c#代码的例子,将创建这个内存问题。谢谢你

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

如果你在不使用参数的情况下动态生成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#代码的例子,将创建这个内存问题。谢谢你

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

如果确实需要刷新缓存,可以调用SqlMapper.PurgeQueryCache()