1

私のアプリは、それを実行中に多くのオブジェクトを生成します。オブジェクトはデータベース クエリの結果として生成され、ORM ソリューションの一部です。これらのオブジェクトを使用するプログラムは、通常、それらを 1 つずつ要求します。

System.Runtime.Caching を使用したいのですが、特定の基準があるため、方法がわかりません。

各ユーザーは異なるデータベースにログインできます。すべてのオブジェクトに適用できます。

データベースには、複数の異なる企業プロファイルを含めることができます。ほとんどのオブジェクトに適用できます。

ほとんどのオブジェクトは多言語対応です。

一部のオブジェクトは、データベース トランザクションが有効な間だけキャッシュされ、ロールバックまたはコミット時にダンプされます。

頭に浮かぶ最初の解決策は、キャッシュ用の複雑な文字列キー (つまり、データベース + 会社 + 言語 + オブジェクトの主キー値) を生成することですが、それが正しい方法かどうかはわかりません。また、トランザクション全体のキャッシュを実装する方法もわかりません。

独自の実装を使用すれば、おそらくキャッシュをより細かく制御できるでしょう。このようなもの:

public class DatabaseCache
{
    private ConcurrentDictionary<string, ClassCache> m_databases = new ConcurrentDictionary<string, ClassCache>();

    public void Add(string database, string className, object item, params string[] itemKeys)
    {
    }
}

public class ClassCache
{
    private ConcurrentDictionary<string, KeyCache> m_cache = new ConcurrentDictionary<string, KeyCache>();

    public void Add(string className, object item, params string[] itemKeys)
    {
    }
}

public class KeyCache
{
    private ConcurrentDictionary<string, object> m_cache = new ConcurrentDictionary<string, object>();

    public void Add(object item, params string[] itemKeys)
    {
    }
}
4

2 に答える 2

1

私は CMS で非常によく似たアプローチを使用しており、かなりうまく機能します (CMS では、ほとんどのオブジェクトが何度も読み取られ、数回書き込まれます)。

更新が発生すると、キャッシュされたオブジェクトは無効になります。私のキャッシュ キー文字列では、最初のパラメーターはキャッシュ インデックスであり、更新が発生すると変更されます。

多くの更新がある場合、すべてのトランザクションは 2 つのことを行うことができます。データベースに変更を加えてから、キャッシュ内のオブジェクトを更新して、オブジェクトを無効にする必要がないようにします。

トランザクション全体のキャッシングに関しては、トランザクションのオブジェクトのすべてのキーを含むリストを保持できます。

トランザクションの最後に、このリストをループして、これらの項目をすべてキャッシュから削除できます。

もう 1 つの方法は、トランザクションのオブジェクトのコレクションを保持し、コレクション オブジェクトをキャッシュに格納することです。このアプローチでは、キャッシュから削除するコレクション オブジェクトのみが存在します。

于 2013-10-14T20:36:48.593 に答える