dapper 缓存的“信息”到底是啥?
Posted
技术标签:
【中文标题】dapper 缓存的“信息”到底是啥?【英文标题】:What exactly is the "information" that dapper caches?dapper 缓存的“信息”到底是什么? 【发布时间】:2012-03-27 21:09:39 【问题描述】:在 Dapper 的文档中发现 here 它指出:
限制和警告Dapper 缓存有关它运行的每个查询的信息,这使它能够快速实现对象并快速处理参数。当前实现将此信息缓存在 ConcurrentDictionary 对象中。
这到底是什么意思? 例如:是缓存返回的数据,还是查询本身,或者两者兼而有之?
它还说“此 [缓存] 数据永远不会刷新”。如果您正在查询的表的设计架构发生更改,这将如何影响“缓存信息”?
【问题讨论】:
【参考方案1】:据我所知,您发出的每个查询都会发出Identity
,具体取决于 sql 查询、其命令类型和参数。缓存是一个可以并发访问的字典。
Dictionary<Identity, CacheInfo> _queryCache
这个CacheInfo
对象包含IDataReader
和IDBCommand
函数和一些限制缓存数量的控制计数器。
由于没有缓存服务器端(数据库模式等),因此实际上没有任何影响。
编辑:这就是 Identity 类用于缓存的样子。
private Identity(string sql, CommandType? commandType, string connectionString, Type type, Type parametersType, Type[] otherTypes, int gridIndex)
this.sql = sql;
this.commandType = commandType;
this.connectionString = connectionString;
this.type = type;
this.parametersType = parametersType;
this.gridIndex = gridIndex;
unchecked
hashCode = 17; // we *know* we are using this in a dictionary, so pre-compute this
hashCode = hashCode * 23 + commandType.GetHashCode();
hashCode = hashCode * 23 + gridIndex.GetHashCode();
hashCode = hashCode * 23 + (sql == null ? 0 : sql.GetHashCode());
hashCode = hashCode * 23 + (type == null ? 0 : type.GetHashCode());
if (otherTypes != null)
foreach (var t in otherTypes)
hashCode = hashCode * 23 + (t == null ? 0 : t.GetHashCode());
hashCode = hashCode * 23 + (connectionString == null ? 0 : connectionString.GetHashCode());
hashCode = hashCode * 23 + (parametersType == null ? 0 : parametersType.GetHashCode());
这里是 CacheInfo
class CacheInfo
public Func<IDataReader, object> Deserializer get; set;
public Func<IDataReader, object>[] OtherDeserializers get; set;
public Action<IDbCommand, object> ParamReader get; set;
private int hitCount;
public int GetHitCount() return Interlocked.CompareExchange(ref hitCount, 0, 0);
public void RecordHit() Interlocked.Increment(ref hitCount);
最后是缓存的容器。
static readonly System.Collections.Concurrent.ConcurrentDictionary<Identity, CacheInfo> _queryCache = new System.Collections.Concurrent.ConcurrentDictionary<Identity, CacheInfo>();
看看源代码,它写得非常好,易于理解/调试。只需将文件拖到您的项目中即可。
【讨论】:
以上是关于dapper 缓存的“信息”到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章
dapper.net,如何刷新 ConcurrentDictionary?