2013-01-07 7 views
20

Am Anfang der Entwicklung unserer App verwendeten wir SQLDependency ziemlich stark, um DB-Ergebnisse zu cachen, bis die Benachrichtigungen unsere App anwiesen, eine neue Kopie zu holen.Verwenden von SQLDependency im Gegensatz zu periodischen Abfragen einer Tabelle (Leistungseinfluss)

Während des Tests haben wir festgestellt, dass die Leistung der SQL-Datenbank durch den SQL-Abhängigkeitsbenachrichtigungsdienst beeinträchtigt wurde. Wir haben die Anzahl der Tabellen, die sqldependency verwendeten, reduziert und einen großen Leistungszuwachs festgestellt. Also dachten wir, wir würden es gerade benutzen und wir gingen weiter. Wir sind jetzt nur noch ein paar Tische.

Später fanden wir heraus, dass wir die Sicherheitszugriffsebene für den Benutzernamen, der die Abhängigkeit festlegen wird, nicht zurückstufen konnten. Wir könnten mehr als eine Verbindungszeichenfolge für jede Datenbank haben (eine für Abhängigkeit und eine für den Rest der Anwendung), aber mit mehreren Datenbank- und Datenbankspiegelungen ist dies ein Problem (von sql db admin Sicht und App-Entwicklung)

an dieser Stelle ganz von SqlDependency entfernt auf der Grundlage der folgenden Logik nur darüber nachzudenken, bewegen:

  1. wir brauchen keine „instant“ Benachrichtigung, dass die Daten geändert haben. Wenn wir innerhalb von 1 Sekunde wüssten, wäre das schnell genug.
  2. Mit ein wenig Re-Factoring, konnten wir es auf nur 1 Tabelle herunterholen und diese Tabelle einmal pro Sekunde abfragen.

Wer sieht einen Fehler in dieser Logik?

Wäre das Abfragen einer Tabelle einmal pro Sekunde mehr oder weniger Belastung für die db als SQLDependency?

Hat jemand ähnliches Leistungsproblem mit SQLDependency gehabt?

+0

Wie erkennt Ihre Umfrage, dass Änderungen stattgefunden haben? Löst aus? –

+0

Ja - löst aus. – SLoret

+0

Als Seitenleiste; Ich habe diese Technologie nie benutzt, aber Sie könnten es nützlich finden: http://msdn.microsoft.com/en-us/library/ms130764(v=sql.105).aspx – MarkD

Antwort

9

Ich wage es, versuchen Sie Ihre Frage zu beantworten. Aber ich bin mir nicht sicher, ob du die Antwort bekommst, auf die du gehofft hast ...

Ich erinnere mich noch in den frühen 90ern, als Borland diese großartige neue Funktion von 'Callbacks' in ihrer Datenbank Interbase propagierte, die dem Anrufer geben würde (Delphi) "Benachrichtigungen" über eine sehr raffinierte neue Technologie, bei der versprochen wurde, dass die Datenbank "aktiv" sein könnte.

Dies wurde später als "waste of time theory" bekannt.

Und ich denke, warum dies nie nahm ist vielleicht, dass, während das Konzept der DBMS sehr vielversprechend aussah, die Datenbank ist eine Ihrer Ebenen, die Sie nur horizontal skalieren können und nicht.

Also Programmiersprachen zur Rettung. Oder vielmehr die Idee der Service Oriented Architecture (SOA). Viele verwechseln SOA mit "Webservices", was in diesem neuen Konzept tatsächlich ein Hype war.

Wenn Sie jedoch das Designmuster "Fiefdom/Emissary" (oder das umbenannte Master/Agent-Muster, um es cooler und professioneller klingen zu lassen) sehen, werden Sie feststellen, dass die ausschließliche Kontrolle über seine Ressourcen die Hauptrolle spielt (Datenbanken lesen) und dass alle Anrufe über einen einzigen Datenadapter geleitet werden.

Offensichtlich funktioniert ein solches Design überhaupt nicht mit Triggern noch Callback-Frameworks.

Aber ich denke, dass Sie Ihr gesamtes Design überdenken sollten.Wenn Sie alle Aktionen und alle Aufrufe über einen einzigen 'DataLayer' bündeln, vielleicht mithilfe von Entity Framework, und vielleicht noch dazu einen Caching-Mechanismus, müssten Sie sich nicht auf Ihre Datenbank verlassen, um Nachrichten in der Nahrungskette weiterzuleiten.

Um zu zeigen, wie komisch Dinge sein können, wenn es um 'datenbankzentriert' geht, hier ist ein extremes Live-Beispiel, wie man eine lange geschriebene E-Mail nicht an einen Programmierer schickt beeindruckt mit:

Fakt 1: Sql Server kann E-Mails senden.

Fakt 2: Asp3 Coder weiß nicht, ob und wie dies in VbScript getan werden kann.

ASP3: Textbox E-Mail-Adresse senden, zu com + Schicht

Com lesen +: Nehmen Sie E-Mail-Adresse und nach vorne zu data

data: Nehmen Sie E-Mail-Adresse und leitet an eine gespeicherte Prozedur

Sproc: E-Mail-Adresse und weiterleiten an SQL-Funktion

Funktion: Do seltsame Sub-String Dinge zu überprüfen, dass E-Mail-Adresse hat @. drin. gib wahr oder falsch zurück.

Sproc: return eine Datensatzgruppe mit einer Spalte und einer Zeile 1 oder 0

data enthält: return den Tisch gibt.

Com +: die erste Spalte konvertieren und mit dem Wert 1 oder 0 bis wahr oder falsch

ASP3 Zeile: wenn true, sendet E-Mail-Adresse mit E-Mail-Betreff und E-Mail-Text com +

Com +: sendet die genaue Informationen zu data

data: ruft eine gespeicherte Prozedur ..

Sproc: ruft eine sQL-Funktion ...

fu nction: verwendet sql server email agent zum senden der email

Wenn Sie so weit lesen, ist mein Rat, sql Server Tabellen, Beziehungen, Indizes und Transaktionen zu verwalten. Das ist sehr gut. Alles, was über diese Aufgaben hinausgeht und mit dem ich Cursor in gespeicherte Prozeduren einbeziehe, wird besser über den richtigen Code gehandhabt.

+2

Können Sie genauer sein? –

Verwandte Themen