2013-01-07 10 views
20

All'inizio dello sviluppo della nostra app, stavamo usando SQLDependency abbastanza pesantemente per memorizzare nella cache i risultati del db fino a quando le notifiche dicevano alla nostra app di prendere una nuova copia.Utilizzo di SQLDependency rispetto al polling periodico di una tabella (impatto sulle prestazioni)

Durante il test, abbiamo notato che le prestazioni di sql db venivano martellate dal servizio di notifica sqldependency. Abbiamo ridimensionato il numero di tabelle che stavamo usando sqldependency e notato un notevole aumento delle prestazioni. Quindi, pensavamo di averla appena terminata e abbiamo proseguito. Adesso siamo a pochi tavoli.

Successivamente abbiamo scoperto che non è stato possibile ridimensionare il livello di accesso di sicurezza per il nome utente che stabilirà la dipendenza. Potremmo avere più di una stringa di connessione per ogni db (uno per la dipendenza e uno per il resto dell'app) ma con più db e db mirroring, si tratta di un dolore (dal punto di vista amministrativo sql db e sviluppo app)

a questo punto ci sono solo pensando di allontanarsi da SqlDependency tutto in base alla seguente logica:

  1. non abbiamo bisogno di notifica "istantanea" che i dati sono cambiati. Se sapessimo entro 1 secondo, sarebbe abbastanza veloce.
  2. Con un po 'di reticolazione, potremmo scendere a un solo tavolo e interrogare quel tavolo una volta al secondo.

Qualcuno vede un difetto in questa logica?

Il polling di una tabella una volta al secondo causerebbe più o meno carico sul db rispetto a SQLDependency?

Qualcuno ha avuto problemi di prestazioni simili con SQLDependency?

+0

In che modo il sondaggio rileva che sono stati apportati cambiamenti? Trigger? –

+0

Sì - trigger. – SLoret

+0

Come barra laterale; Non ho mai usato questa tecnologia, ma potresti trovarla utile: http://msdn.microsoft.com/en-us/library/ms130764(v=sql.105).aspx – MarkD

risposta

9

oso provare a rispondere alla tua domanda. Ma non sono sicuro che otterrai la risposta che speravi ...

Mi ricordo nei primi anni '90 quando Borland promosse questa grande nuova funzionalità di "callback" nel loro database Interbase che avrebbe dato al chiamante (Delphi) "notifiche" tramite una nuova tecnologia molto ingegnosa in cui è stato fatto promettere che il database potrebbe essere "attivo".

Questo è stato successivamente conosciuto come "waste of time theory".

E immagino perché questo non sia mai stato preso in considerazione, forse mentre il concetto di DBMS sembrava molto promettente, il database è uno dei tuoi livelli che puoi solo scalare e non orizzontalmente.

Così i linguaggi di programmazione in soccorso. O piuttosto l'idea di Service Oriented Architecture (SOA). Molti confondono SOA per 'Webservices' che era davvero un clamore incluso in questo nuovo concetto.

Ma se verifichi il modello di progettazione di Fiefdom/Emissary (o il pattern Master/Agent rinominato per renderlo più bello e professionale), scoprirai che l'idea principale è avere il controllo esclusivo delle sue risorse (leggi i database) e che tutte le chiamate vengono canalizzate tramite un singolo adattatore dati.

Ovviamente un tale progetto non funziona affatto con trigger o quadri di callback.

Ma penso che dovresti riconsiderare l'intero progetto.Se si canalizzano tutte le azioni e tutte le chiamate tramite un singolo 'DataLayer', forse usando Entity Framework, e forse in cima a quel meccanismo di Caching non si dovrebbe fare affidamento sul proprio database per inoltrare i messaggi nella catena alimentare.

Per mostrare come possono essere strane le cose quando si è in 'database-centric', ecco un esempio reale estremamente reale di come non inviare una e-mail, scritta molto tempo fa, da un programmatore Non ero così tanto impressionato con:

Fatto 1: il server Sql può inviare e-mail.

Fatto 2: il codificatore Asp3 non sa se o come questo può essere fatto in VbScript.

ASP3: leggere testo indirizzo e-mail, inviare a COM + strato

COM +: prendere indirizzo e-mail e in avanti per dataLayer

dataLayer: prendere indirizzo e-mail e in avanti per una stored procedure

Sproc: prendere l'indirizzo email e inoltrare alla funzione sql

funzione: fare strane sottostrutture per verificare che l'indirizzo di posta elettronica abbia @. dentro. restituisce vero o falso.

Sproc: restituire un recordset con una colonna e una riga contenente 1 o 0

dataLayer: riportare la tabella così com'è.

COM +: convertire la prima colonna e riga con il valore 1 o 0 per vero o falso

ASP3: se è vero, inviare E-mail con oggetto dell'e-mail e il testo e-mail a COM +

COM +: invia il informazioni esatte per dataLayer

dataLayer: chiama una stored procedure ..

Sproc: chiama una sql-funzione di ...

fu nction: utilizza l'agente di posta elettronica SQL Server per inviare l'email

Se si legge fino a questo punto, il mio consiglio è di consentire a SQL Server di gestire tabelle, relazioni, indici e transazioni. È molto bravo in questo. Qualunque cosa va al di là di questi compiti, e con ciò includo i cursori nelle stored procedure, è gestita meglio tramite il codice corretto.

+2

Puoi essere più specifico? –

Problemi correlati