大まかにキャッシュする "情報"は正確に何ですか?

caching dapper

質問

見つかったDapperののドキュメントで、ここでは述べています:

" 制限と警告

Dapperは実行するすべてのクエリに関する情報をキャッシュします 。これにより、オブジェクトを素早くマテリアライズし、パラメータを素早く処理できます。現在の実装は、この情報をConcurrentDictionaryオブジェクトにキャッシュします。

これはどういう意味ですか?例:返されたデータ、またはクエリ自体、またはその両方のビットをキャッシュしていますか?

また、「 この[キャッシュされた]データは決してフラッシュされません 」というメッセージも表示されます。クエリのテーブルのデザインスキーマが変更された場合、これはどのように「キャッシュ情報」に影響しますか?

受け入れられた回答

私の知る限り、各クエリには、SQLクエリ、コマンドタイプ、およびそのパラメータに応じてIdentityを発行します。キャッシュは、同時にアクセスできる辞書です。

Dictionary<Identity, CacheInfo> _queryCache

このCacheInfoオブジェクトには、 IDataReader関数とIDBCommand関数、およびキャッシュされた量を制限するいくつかの制御カウンタが含まれています。

サーバサイド(データベーススキーマなど)はキャッシュされないため、実際には何の影響もありません。

編集:どのようにアイデンティティクラスは、キャッシュに使用されるように見えます。

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は合法ですか? はい、理由を学ぶ