17

Stavo sviluppando questa applicazione su VB.net 2010 e SQL 2008.
Desidero che i client vengano notificati per gli aggiornamenti sul db e l'applicazione utilizzata per controllare il db per le modifiche nel minuto specificato utilizzando un timer, che in realtà non è efficiente. Ho letto su query notification, sqldependency, service broker, ma poi ho letto qualcosa che diceva che potrebbero non essere efficienti se ho 100 client e sto usando le notifiche di query per inviare notifiche alla mia applicazione.
Qualcuno potrebbe aiutare su cosa dovrei fare, e come posso farlo (sarebbe molto utile se gli esempi sono disponibili). Grazie in anticipo!Voglio il mio database (SQL) per notificare o inviare aggiornamenti all'applicazione client

risposta

16

La notifica di query invia a un servizio di Service Broker, non direttamente all'applicazione. Vedi The Mysterious Notification per capire come funziona. La tua applicazione è in attesa di notifiche pubblicando una dichiarazione . Il che implica che ciascuno dei 100 client occupa un thread di lavoro di SQL Server (che sono limitati, vedere l'opzione max worker threads). Ho visto questo funzionare in produzione con +1000 client (dopo aver sollevato l'opzione max worker threads) ma vorrei consigliare contro it.

La mia raccomandazione sarebbe quella di avere il monitoraggio del servizio uno per la modifica, utilizzando SqlDependency/QueryNotifications. Questo servizio quindi invierà notifiche, utilizzando WCF, ad esempio, a tutte le app in esecuzione. Sottoscrivere modifiche generiche (the table Foo was changed), non specifiche (the row x in table Foo was inserted).

Come regola generale, SqlDependency/Query Notifications può solo informare l'utente che i dati sono stati modificati, ma non spinge i nuovi dati . L'applicazione deve aggiornare i propri set di dati locali eseguendo nuovamente le query, una volta notificate.

3

Prestare attenzione all'utilizzo della classe SqlDependency - ha il problems con perdite di memoria. Hovewer, puoi utilizzare una realizzazione open source della classe SqlDependency - SqlDependencyEx. Utilizza un trigger del database e una notifica nativa di Service Broker per ricevere eventi relativi alle modifiche della tabella. Questo è un esempio di utilizzo:

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 voi sono in grado di monitorare solo UPDATE, DELETE e INSERT evitando. Spero che questo ti aiuti.