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

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

谁能解释一下这是什么意思(来自 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/

相关文章:

SQL 查询需要出现空值

mysql - SQL Select Data 具有多行条件

c# - 如何访问主窗体公共(public)属性 WPF

c# - IronPython:从主机应用程序添加引用

sql-server-2005 - 在 SQL Server 事务中更改表

performance - SQL Server中的 "OR"是否短路?

sql-server-2005 - 忽略T-SQL中的XML namespace

c# - 由于Windows系统崩溃,C#解决方案和源文件已损坏

c# - 从 Xamarin Forms UWP 中的 Webview 获取内容高度

sql-server - 如何检查不同sql数据库中的表是否存在?