¿Cómo notifico a mi aplicación si hubo un cambio en una tabla de mi base de datos SQL Server?

publicado por: Anonymous

Me gustaría saber cómo puedo realizar esto ya que podría implementar un mecanismo de cache para una aplicación de ejemplo escrita en C#. Esta implementación está destinada a que termine como librería.

Sé que EntityFramework tiene un mecanismo algo parecido con Auto Refresh y que NHibernate tiene niveles de cache. Pero tengo una idea vaga del concepto y no tengo idea de cómo funcionan internamente.

Por lo poco que investigué, sé que algo tiene que ver con SQL Server Broker Service, donde el servicio envía mensajes a MSMQ y desde mi aplicación hago pooling contra MSMQ pero nunca vi un ejemplo de implementación.

Actualización

Bien, para contextualizar a dónde se aplica esto, se trata de un Sistema de Gestión de Almacenes a nivel industrial. El sistema tiene alrededor de 15 servicios corriendo al mismo tiempo y preguntándole a la base de datos todo el tiempo sobre el movimiento de los productos y contenedores que están las respectivas zonas de almacenamiento.

¿Por qué razón hay 15 servicios funcionando?

El almacén que usa este sistema de gestión tiene varias líneas con escáneres de código de barra leyendo alrededor de 10 etiquetas por minuto en hora pico y, cada una de esta líneas, tiene un servicio en particular porque varía la lógica en cada línea y en cada lógica hace una verificación a diferentes servicios y la existencia de dicho código de barras en la base de datos.

Además, tiene 10 AGV (Automated Guided Vehicle) que tienen servicios como: Emisor de tareas para AGV, Planificador de Tareas a realizar, etc. y estos están constantemente pooleando contra la base de datos buscando nuevas tareas para realizar. Lo mismo sucede con las terminales de los operarios de montacargas que todo el tiempo poolean la base de datos en busca de nuevas órdenes de movimiento de contenedores.

Falta agregar que también la recepción, despacho y almacenado también están automatizados y cada uno de estos tiene su(s) propio(s) servicio(s).

¿Por qué el sistema no tiene middleware?

Debo aclarar que este sistema, de tal magnitud, no tiene middleware (que sería una gloria que tenga porque solventaría muchos problemas arquitectónicos) ya que es un sistema adaptado a un viejo sistema del año 1995 aprox. y otros sistemas más donde la producción era acotada para esas fechas. Hoy en día, se tuvo que actualizar y estamos teniendo problemas de escalabilidad para aumentar la producción.

A entender esto, la BL y el DAL están en el mismo servidor y, por ende, no me da la posibilidad de distribuir la carga de consulta de datos.

Aclaro que la aplicación tiene el cliente hecho en WinForms donde se conectan a los servicios (aplicación de consola).

solución

Una solución podría ser usando las “Query Notifications” que permiten, desde .NET, recibir notificaciones de cambios realizados en los datos de SQL Server. En este artículo de la MSDN se puede ver un ejemplo sencillo de como detectar los cambios y recibir los eventos.

También puede ser interesante unir esto con SignalR para que las aplicaciones cliente no sean las que se conectan directamente con SQL Server. En CodeProject hay un artículo “Real Time Notifications using SignalR and SQL Dependency” que es muy interesante.

Desconozco si esta solución proporcionará el rendimiento que se necesita o si por el contrario la solución pudieran ser cosas como SQL Server R Services, un ServiceBus, …

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *