ver obtener datos create change cambiar sql-server push-notification service-broker sqldependency query-notifications

sql server - obtener - Quiero que mi base de datos(SQL) notifique o envíe actualizaciones a la aplicación cliente



sql get collation of a database (3)

Estaba desarrollando esta aplicación en VB.net 2010 y SQL 2008 .
Quería que se notificara a los clientes sobre las actualizaciones en la base de datos, y que la aplicación se utilizara para verificar la db en busca de cambios en el minuto especificado usando un temporizador, lo que realmente no es eficiente. Leí sobre la query notification , la sqldependency , el service broker , pero luego leí algo que decía que podría no ser eficiente si tengo 100 clientes y estoy usando notificaciones de consulta para enviar notificaciones a mi aplicación.
Alguien me ayudaría con lo que debería hacer y cómo puedo hacerlo (sería muy útil si hay ejemplos disponibles). ¡Gracias por adelantado!


La notificación de consulta se enviará a un servicio de Service Broker, no directamente a su aplicación. Vea La Notificación Misteriosa para entender cómo funciona. Su aplicación está a la espera de notificaciones mediante la publicación de una WAITFOR(RECEIVE) en la base de datos . Lo que implica que cada uno de los 100 clientes está ocupando un subproceso de trabajo de SQL Server (que están limitados, vea max worker threads opción de max worker threads ). He visto esto trabajando en la producción con más de 1000 clientes (después de aumentar la opción de subprocesos de trabajo máximo), pero no lo recomendaría.

Mi recomendación sería tener un servicio de monitoreo para el cambio, usando SqlDependency / QueryNotifications. Este servicio luego enviaría notificaciones, utilizando WCF, por ejemplo, a todas sus aplicaciones en ejecución. Se suscribiría a los cambios genéricos ( the table Foo was changed ), no a los específicos ( the row x in table Foo was inserted ).

Como regla general, SqlDependency / Query Notifications solo puede informarle que los datos han cambiado, pero no enviará los nuevos datos. La aplicación debe actualizar sus conjuntos de datos locales ejecutando las consultas nuevamente, una vez notificada.


Si no actualiza databse manualmente y toda la manipulación de datos está en su aplicación, debe detectar cambios en la capa de servicio de la aplicación o en la capa de negocios en lugar de db en caso de que dependa de la tecnología de base de datos y vaya a otras bases de datos será difícil. Por otra parte, si tiene una actualización manual en la base de datos o la dependencia de la base de datos no es importante, puede usar CDC (captura de datos de cambios) e introducir cambios en el agente de servicios y los cambios emergentes de su aplicación del agente de servicios y luego enviarlos al cliente mediante tecnología de comunicación http bidireccional. igual que SignalR.


Tenga cuidado al usar la clase SqlDependency , ya que tiene problems con las pérdidas de memoria. Sin embargo, puede usar una realización de código abierto de la clase SqlDependencyEx - SqlDependencyEx . Utiliza un activador de base de datos y una notificación nativa de Service Broker para recibir eventos sobre los cambios en la tabla. Este es un ejemplo de uso:

int changesReceived = 0; using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Make table changes. MakeTableInsertDeleteChanges(changesCount); // Wait a little bit to receive all changes. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);

Con SqlDependecyEx puede monitorear solo ACTUALIZAR, evitando BORRAR e INSERTAR. Espero que esto ayude.