c# - Mejores prácticas de HttpRuntime.Cache
(4)
De acuerdo con esta documentación http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx acceso al objeto de caché es seguro para subprocesos. En cuanto a los objetos que almacena en el hilo de caché, la seguridad debe provenir de otro lugar.
En el pasado, he bloqueado el acceso al mecanismo HttpRuntime.Cache. No estoy seguro de si realmente había investigado el problema en el pasado y lo había rodeado de una cerradura.
¿Crees que esto es realmente necesario?
Este artículo sugiere que se debe usar un candado:
http://msdn.microsoft.com/en-us/magazine/cc500561.aspx
Citar:
El problema es que si tiene una consulta que demora 30 segundos y ejecuta la página cada segundo, en el tiempo que toma llenar el elemento de caché, entrarán otras 29 solicitudes, todas las cuales intentarán llenar El elemento de caché con sus propias consultas a la base de datos. Para resolver este problema, puede agregar un bloqueo de hilo para evitar que las ejecuciones de otras páginas soliciten los datos de la base de datos.
Aquí está su fragmento de código:
// check for cached results
object cachedResults = ctx.Cache["PersonList"];
ArrayList results = new ArrayList();
if (cachedResults == null)
{
// lock this section of the code
// while we populate the list
lock(lockObject)
{
cachedResults = ctx.Cache["PersonList"];
// only populate if list was not populated by
// another thread while this thread was waiting
if (cachedResults == null)
{
cachedResults = ...
ctx.Cache["PersonList"] = cachedResults;
}
}
}
No he probado este código, pero me interesaría mucho escuchar a alguien que haya evaluado este enfoque en un entorno de producción.
No creo que el bloqueo sea la respuesta al problema a continuación, especialmente en el entorno de producción, donde tiene varios servidores ejecutando su aplicación.
El problema es que si tiene una consulta que demora 30 segundos y ejecuta la página cada segundo, en el tiempo que toma llenar el elemento de caché, entrarán otras 29 solicitudes, todas las cuales intentarán llenar El elemento de caché con sus propias consultas a la base de datos. Para resolver este problema, puede agregar un bloqueo de hilo para evitar que las ejecuciones de otras páginas soliciten los datos de la base de datos.
No creo que sea necesario envolver el acceso a la propiedad HttpRuntime.Cache con un bloqueo, ya que la propiedad .Cache es estática y también segura para subprocesos.
Hay muchas maneras diferentes de acceder al objeto Cache (HttpRuntime.Cache, HttpContext.Current.Cache, Page.Cache, etc.). Todos acceden al mismo objeto de caché, ya que solo hay un objeto de caché por dominio de aplicación, ya que efectivamente es un objeto Singleton seguro para subprocesos.