【问题标题】:How to periodically flush dapper.net cache when used with SQL Server与 SQL Server 一起使用时如何定期刷新 dapper.net 缓存
【发布时间】:2011-10-12 16:38:44
【问题描述】:

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

限制和警告

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2012-03-28
      • 2012-06-23
      相关资源
      最近更新 更多