精打細算緩存的“信息”究竟是什麼?

caching dapper

在發現小巧玲瓏的文檔, 在這裡它指出:

限制和警告

Dapper緩存有關它運行的每個查詢的信息 ,這使它能夠快速實現對象并快速處理參數。當前實現將此信息緩存在ConcurrentDictionary對像中。“

這到底是什麼意思?例如:它是緩存返回的數據,還是查詢本身,還是兩者的位?

它還說“ 這[緩存的]數據永遠不會被刷新 ”。如果您要查詢的表的設計架構發生變化,這會如何影響“緩存信息”?

一般承認的答案

據我所知,每個查詢都會發出一個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>();

看看源代碼,它寫得很好,易於跟踪/調試。只需將文件拖到項目中即可。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因