আরম্ভকারীদের জন্য আমাকে এটি কেবল এখানে ফেলে দিন যে আমি জানি যে নীচের কোডটি থ্রেড নিরাপদ নয় (সংশোধন: হতে পারে)। আমি যেটির সাথে লড়াই করছি তা হ'ল এমন একটি বাস্তবায়ন খুঁজে পাওয়া যা আমি আসলে পরীক্ষার অধীনে ব্যর্থ হতে পারি। আমি এখনই একটি বড় ডাব্লুসিএফ প্রকল্পটি রিফ্যাক্টর করছি যার জন্য কিছু (বেশিরভাগ) স্থিতিশীল ডেটা থাকা দরকার এবং এটি একটি এসকিউএল ডাটাবেস থেকে পপুলেটেড। দিনে অন্তত একবার এটির মেয়াদ শেষ হয়ে যাওয়া এবং "রিফ্রেশ" করা দরকার যার কারণে আমি মেমোরিচ্যাচ ব্যবহার করছি।
আমি জানি যে নীচের কোডটি থ্রেড নিরাপদ হওয়া উচিত নয় তবে ভারী বোঝার নিচে ব্যর্থ হওয়া এবং বিষয়গুলিকে জটিল করতে গুগল অনুসন্ধান কার্যকরভাবে উভয় উপায়ে (প্রয়োজনীয় তালিকাগুলির সাথে এবং লকগুলি ছাড়াও প্রয়োজনীয় প্রয়োজন কিনা তা দেখায়) get
একাধিক থ্রেড পরিবেশে মেমোরি ক্যাশের জ্ঞানযুক্ত কেউ কি আমাকে যথাযথভাবে লক করতে হবে কিনা তা আমাকে নিশ্চিতভাবে জানাতে পারে যাতে রিমুভাল / রিপোপুলেশন চলাকালীন একটি কল (যা খুব কমই বলা হবে তবে এটি প্রয়োজনীয়তা হবে) সরাতে পারে না।
public class MemoryCacheService : IMemoryCacheService
{
private const string PunctuationMapCacheKey = "punctuationMaps";
private static readonly ObjectCache Cache;
private readonly IAdoNet _adoNet;
static MemoryCacheService()
{
Cache = MemoryCache.Default;
}
public MemoryCacheService(IAdoNet adoNet)
{
_adoNet = adoNet;
}
public void ClearPunctuationMaps()
{
Cache.Remove(PunctuationMapCacheKey);
}
public IEnumerable GetPunctuationMaps()
{
if (Cache.Contains(PunctuationMapCacheKey))
{
return (IEnumerable) Cache.Get(PunctuationMapCacheKey);
}
var punctuationMaps = GetPunctuationMappings();
if (punctuationMaps == null)
{
throw new ApplicationException("Unable to retrieve punctuation mappings from the database.");
}
if (punctuationMaps.Cast<IPunctuationMapDto>().Any(p => p.UntaggedValue == null || p.TaggedValue == null))
{
throw new ApplicationException("Null values detected in Untagged or Tagged punctuation mappings.");
}
// Store data in the cache
var cacheItemPolicy = new CacheItemPolicy
{
AbsoluteExpiration = DateTime.Now.AddDays(1.0)
};
Cache.AddOrGetExisting(PunctuationMapCacheKey, punctuationMaps, cacheItemPolicy);
return punctuationMaps;
}
//Go oldschool ADO.NET to break the dependency on the entity framework and need to inject the database handler to populate cache
private IEnumerable GetPunctuationMappings()
{
var table = _adoNet.ExecuteSelectCommand("SELECT [id], [TaggedValue],[UntaggedValue] FROM [dbo].[PunctuationMapper]", CommandType.Text);
if (table != null && table.Rows.Count != 0)
{
return AutoMapper.Mapper.DynamicMap<IDataReader, IEnumerable<PunctuationMapDto>>(table.CreateDataReader());
}
return null;
}
}