私はヘルパークラスをWebアプリケーションに持っていますが、一般的で不変なデータオブジェクトを静的プロパティとして提示することがあります。これらのオブジェクトを次のように読み込んでいます:キャッシュにデータをロードするためのロック
public static class MyWebHelper
{
#region - Constants & Fields
private const string LocationCacheKey = "MyWebHelper_Locations";
private static object LocationLoadLock = new object();
private static MemoryCache m_SiteCache;
#endregion
#region - Properties
/// <summary>
/// Gets the uneditable collection of locations.
/// </summary>
public static ReadOnlyCollection<Location> Locations
{
get
{
EnsureLocationsCache();
return (ReadOnlyCollection<Location>)SiteCache[LocationCacheKey];
}
}
/// <summary>
/// Gets the MemoryCache object specific for my site cache.
/// </summary>
public static MemoryCache SiteCache
{
get
{
if (m_SiteCache == null)
{
m_SiteCache = new MemoryCache("MyWeb_SiteCache");
}
return m_SiteCache;
}
}
#endregion
#region - Methods
private static void EnsureLocationsCache()
{
lock (LocationLoadLock)
{
if (SiteCache[LocationCacheKey] == null)
{
//
// Load all Locations from the database and perform default sorting on location code.
//
List<Location> lLocations = DataAccess.GetAllLocations();
lLocations.Sort(delegate(Location l1, Location l2) { return string.CompareOrdinal(l1.Code, l2.Code); });
SiteCache[LocationCacheKey] = new ReadOnlyCollection<Location>(lLocations);
}
}
}
#endregion
}
私の質問は何ですか?私はデータベースへの呼び出しを減らそうとしていますが、オーバーヘッドを導入するだけのロックですか?キャッシュされたデータはサイト全体でかなり一般的に使用されており、ほとんど変更されません。また、私は正しい場所にロックしていますか?
Lazyを見ると、ロック機構を抽象化するのに役立ちます。 –
asawyer
@asawyer私はLazyソリューションのテストをコーディングし、正しく実行されているかどうかチェックしたいと考えています。私はこのコードを編集してこの質問に投稿するのか、この質問に答えるのか、あるいは新しい質問を投稿するべきですか? –