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 对象包含IDataReaderIDBCommand 函数和一些限制缓存数量的控制计数器。

由于没有缓存服务器端(数据库模式等),因此实际上没有任何影响。

编辑:这就是 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?

Dapper扩展SQL跟踪及全局缓存通知

SSL缓存是啥

ssl缓存是啥

我在浏览器输入m3u8链接,直接下载了一个文件,这个文件打不开,说没有打开应用,这个文件到底是啥

Redis缓存穿透击穿雪崩到底是个啥?7张图告诉你