sqltabledependency sqlnotificationrequest notification framework ejemplo dependency codeproject c# sql-server sql-server-2008 sqldependency

c# - framework - sqlnotificationrequest



SqlDependency Reliablity? (2)

Mi situación actual es que tengo una aplicación que necesita ser notificada cuando llegan nuevos datos en una tabla de base de datos. Los datos provienen de una fuente externa (que no tengo control, esta es la única opción de integración). Cuando llegan nuevos datos, mi aplicación debe realizar ciertas acciones, básicamente consultar los nuevos datos, manejarlos, insertar el resultado en una tabla local, etc.

Quiero evitar el sondeo si es posible, ya que se espera que los datos se manejen en tiempo real. Dicho eso, asegurarse de que nunca se pierda ningún dato es la prioridad número 1.

Mis preguntas:

  1. ¿SqlDependency generalmente se considera confiable?
  2. ¿Debo preocuparme por las condiciones de carrera, por ejemplo, estoy manejando un cambio cuando llega otro?
  3. ¿Qué sucede cuando la base de datos se reinicia? ¿Mi aplicación se recuperará y comenzará a recibir cambios de nuevo, o necesitaré un temporizador a prueba de fallas de algún tipo que volverá a suscribirse a las notificaciones periódicamente?
  4. La mayoría de los artículos que he leído sobre el tema se refieren a SQL Server 2005. Estoy usando SQL Server 2008 R2. ¿Hay alguna técnica más nueva que se prefiera a SqlDependency?
  5. (Editar) Además, ¿qué pasa si la aplicación se cae? ¿Supongo que tendré que consultar los datos perdidos en la puesta en marcha?

1) Sí, lo considero confiable ya que lo hace correctamente, el propósito fue diseñado para hacer (invalidación de caché)

2) No. Es por eso que solo puede suscribirse emitiendo una consulta, esto asegura que no haya una carrera entre la obtención de los datos y las nuevas actualizaciones notificando

3) El reinicio de la base de datos (o instancia) señala todas las notificaciones de consulta pendientes con un valor SqlNotificationInfo de Restart . Lea cómo SqlDependency y se basa en Query Notification para una mejor comprensión. Como SqlDependency mantiene una conexión abierta a la base de datos todo el tiempo, SqlDependency detectará la falta de disponibilidad de la base de datos incluso antes de cualquier notificación de consulta explícita

4) No. Más sobre esto más abajo ...

5) No hay ''datos perdidos''. Notificación de consulta (y por lo tanto SqlDependency) nunca le notifique sobre qué datos han cambiado. Solo te notifica que ha cambiado . Siempre se supone que debe regresar y leer todos los datos para ver qué ha cambiado (y lo remito a la pregunta / respuesta n. ° 2). Una aplicación recién iniciada aún no había consultado los datos para comenzar, por lo que no hay ningún cambio para ser notificado. Solo después de que haya consultado por primera vez los datos, puede recibir una notificación.

Por la descripción de su problema, no estoy seguro de que necesite notificaciones de consulta. Me parece que desea actuar sobre cualquier cambio, no importa cuándo sucedió, incluso si su aplicación no se estaba ejecutando . Esto ciertamente no es la invalidación de caché, es el seguimiento de cambios. Por lo tanto, debe implementar una tecnología de seguimiento de cambios, como Change Data Capture o Change Tracking , que son solo SQL Server 2008 y posteriores (no están disponibles en SQL Server 2005). Con SQL Server 2005 no es raro implementar un activador y poner un mensaje en cola para que Service Broker maneje el mismo problema que está tratando de manejar (detectar cambios, reaccionar a cada fila de datos nuevos).


Desde el punto de vista de un desarrollador .net que solo quiere usarlo para la invalidación de caché, ha sido un verdadero dolor y no es completamente confiable.

La configuración y la solución de problemas han sido particularmente dolorosas, logramos que funcione bien en un entorno pero luego no funciona en otro. Averiguar por qué ha sido difícil y lento.

Incluso cuando todo está funcionando, no es completamente confiable. SQL Server puede eliminar notificaciones si está bajo mucha carga y hay problemas conocidos con el reinicio y las notificaciones no se reanudan: http://connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql-server-restarts .

Evitaría si hay una tecnología alternativa que hace lo que quiere y es menos problemática.