Pregunta

En este momento estoy trabajando en una aplicación de administración de proyectos en C # 3.5 en ASP.net. Para reducir las visitas a la base de datos, estoy almacenando mucha información en caché usando variables estáticas. Por ejemplo, una lista de usuarios se mantiene en memoria en una clase estática. La clase lee toda la información de la base de datos al inicio y actualizará la base de datos cada vez que se realicen cambios, pero nunca necesita leer desde la base de datos.

La clase hace ping a otros servidores web (si existen) con información actualizada al mismo tiempo que escribe en la base de datos. El mecanismo de ping es un servicio de Windows en el que el objeto de caché se registra utilizando un puerto aleatorio disponible. También se usa para otras cosas.

La cantidad de datos no es tan buena. En este momento lo estoy usando solo para almacenar en caché a los usuarios (hash de contraseña, permisos, nombre, correo electrónico, etc.) Simplemente guarda un montón de llamadas que se realizan en la base de datos.

Me preguntaba si hay algún obstáculo para este método y / o si hay mejores formas de almacenar en caché los datos.

¿Fue útil?

Solución

Una trampa: un campo estático tiene un alcance por dominio de aplicación, y una mayor carga hará que el servidor genere más dominios de aplicación en el grupo. Esto no es necesariamente un problema si solo lee las estadísticas, pero obtendrá datos duplicados en la memoria, y obtendrá un éxito cada vez que se cree o recicle un dominio de aplicación.

Es mejor usar el objeto Cache: está destinado a cosas como esta.

Editar: Resulta que estaba equivocado sobre AppDomains (como se señala en los comentarios): se generarán más instancias de la Aplicación bajo carga, pero todas se ejecutarán en el mismo AppDomain. (¡Pero aún debe usar el objeto Cache!)

Otros consejos

Siempre que pueda esperar que el caché nunca crezca a un tamaño mayor que la cantidad de memoria disponible, está bien. Además, asegúrese de que solo haya una instancia de esta aplicación por base de datos, o las memorias caché en las diferentes instancias de la aplicación podrían "no estar sincronizadas".

Donde trabajo, tenemos un O / RM de cosecha propia, y hacemos algo similar a lo que está haciendo con ciertas tablas que no se espera que crezcan o cambien mucho. Entonces, lo que está haciendo no tiene precedentes, y de hecho en nuestro sistema, es probado y verdadero.

Otra trampa que debes considerar es la seguridad de los hilos. Todas las solicitudes de su aplicación se ejecutan en el mismo AppDomain pero pueden venir en diferentes hilos. El acceso a una variable estática debe tener en cuenta el acceso desde múltiples subprocesos. Probablemente un poco más de lo que estás buscando. El objeto de caché es mejor para este propósito.

Hmmm ... El " clásico " el método sería el caché de la aplicación, pero siempre que nunca actualice las variables estáticas, o comprenda los problemas de bloqueo si lo hace, y comprende que pueden desaparecer en cualquier momento con un reinicio del dominio de la aplicación, entonces realmente no veo el daño al usar un estática.

Le sugiero que busque formas de tener un caché distribuido para su aplicación. Puede echar un vistazo a NCache o indeXus.Net

La razón por la que sugerí eso es porque creó su propia forma ad-hoc de actualizar la información que está almacenando en caché. Las variables / referencias estáticas están bien, pero no se actualizan / actualizan (por lo que tendrá que manejar el envejecimiento por su cuenta) y parece que tiene una configuración distribuida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top