L
Lloyd Dupont
in an ASP.NET page I have some static method which get value for the cache
or, if the cache is empty, query the database, put the value in the cache
and return it.
because ASP.NET is thread intensive I was thinking to lock these method,
using a fine grained lock.
the best lock I was thinking about was the string key in the cache!
however I have one concern, these unique string might be used in other lock,
could they?
could this be a problem ?
here is my code I wonder about:
-----------
public static string LogsByMonthCacheKey(string blogname)
{
return string.Intern(BLOG_KEY + ":LogsByMonth:" + blogname);
}
public static DataTable GetLogsByMonth(string blogname)
{
string ck = LogsByMonthCacheKey(blogname);
lock(ck) // lock with a unique string, is it alright ?
{
DataTable result = (DataTable) GetCache(ck);
if (result != null)
return result;
SqlConnection conn = DBConnectionPool.Get();
try
{
SqlCommand select = conn.CreateCommand();
select.CommandText = "dbo.gb_EntryByMonth";
select.CommandType = CommandType.StoredProcedure;
select.Parameters.Add(new SqlParameter("@blogname",
blogname));
SqlDataAdapter sda = new SqlDataAdapter(select);
result = new DataTable();
sda.Fill(result);
}
finally { DBConnectionPool.Let(conn); }
AddCache(ck, result);
return result;
}
}
or, if the cache is empty, query the database, put the value in the cache
and return it.
because ASP.NET is thread intensive I was thinking to lock these method,
using a fine grained lock.
the best lock I was thinking about was the string key in the cache!
however I have one concern, these unique string might be used in other lock,
could they?
could this be a problem ?
here is my code I wonder about:
-----------
public static string LogsByMonthCacheKey(string blogname)
{
return string.Intern(BLOG_KEY + ":LogsByMonth:" + blogname);
}
public static DataTable GetLogsByMonth(string blogname)
{
string ck = LogsByMonthCacheKey(blogname);
lock(ck) // lock with a unique string, is it alright ?
{
DataTable result = (DataTable) GetCache(ck);
if (result != null)
return result;
SqlConnection conn = DBConnectionPool.Get();
try
{
SqlCommand select = conn.CreateCommand();
select.CommandText = "dbo.gb_EntryByMonth";
select.CommandType = CommandType.StoredProcedure;
select.Parameters.Add(new SqlParameter("@blogname",
blogname));
SqlDataAdapter sda = new SqlDataAdapter(select);
result = new DataTable();
sda.Fill(result);
}
finally { DBConnectionPool.Let(conn); }
AddCache(ck, result);
return result;
}
}