0

我是 dapper 的新手,并计划在我的新项目中使用它。读完之后,似乎我唯一可能遇到的问题是 ConcurrentDictionary。

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

我该如何避免这个问题?有人可以告诉我一些代码告诉我如何以及何时刷新它吗?

4

1 回答 1

2

根据上面的评论,这是一个即时示例:

var builder = new StringBuilder();
builder.AppendLine("SELECT Foo FROM Bar");
if (fisrtName != null || lastName != null)
    builder.AppendLine("WHERE");
if (firstName != null)
    builder.AppendLine("    Bar.FirstName = @Firstname");
if (firstName != null && lastName != null)
    builder.Append(" AND");
if (lastName != null)
    builder.AppendLine("    Bar.LastName = @LastName");
var sql = builder.ToString();

如您所见,dapper 现在将运行的实际 SQL 将根据firstName和/或lastName是否为空而有所不同。如果两者都为空,您将获得一个 SQL 字符串。如果 onlyfirstName不为空,你会得到另一个。如果 onlylastName不为空,你会得到另一个。最后,如果两者都不为空,您将得到第四个排列。

这就是“on-the-fly”的含义——dapper 将基于这些独特的排列进行缓存,并且在更复杂的场景中,很容易看出你将如何最终得到许多不同的排列,所有其中需要独立缓存。

于 2012-05-04T20:22:39.903 回答