谁能解释一下这是什么意思(来自 Dapper.net 网站)
限制和注意事项
Dapper 缓存有关其运行的每个查询的信息,这使其能够快速具体化对象并快速处理参数。当前实现将此信息缓存在 ConcurrentDictionary 对象中。它存储的对象永远不会被刷新。 如果您在不使用参数的情况下即时生成 SQL 字符串,则可能会遇到内存问题。我们可能会将字典转换为 LRU 缓存。
我不明白粗体字是什么意思。我正在使用 SQL Server 和 C# 客户端。
有人可以提供一个会造成此内存问题的 C# 代码示例吗?谢谢
最佳答案
If you are generating SQL strings on the fly without using parameters it is possible you will hit memory issues.
你可以这样做:
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
值编写查询时,它都会被缓存。这会爆炸你的内存。
后者要优越得多。它避免了注入(inject)攻击。 dapper 可以缓存一次。 SQL Server会编译一次执行计划并缓存。
您应该(势在必行)已经在使用参数化查询。如果你不是,那就放下你正在做的一切,把它作为当务之急。
Can someone please give a sample of c# code that will create this memory issue. thank you
只需循环执行前者。看着你的内存力增长。循环执行后者。看着你的内存力不增长。
关于c# - 与 SQL Server 一起使用时如何定期刷新 dapper.net 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6818258/