Ist die Abfrage die einzige Möglichkeit, die App-Daten aus einer Datenbank zu aktualisieren?


17

Eine Anwendung muss Daten aus einer Datenbank so aktuell wie möglich haben. Gibt es in einem solchen Fall eine andere Möglichkeit zum Abrufen der Daten als die zeitgesteuerte Abfrage (Abfrage) der Datenbank?

Ich arbeite mit MS SQL Server 2008 (und .NET-Anwendungen + Entity Framework), möchte aber auch andere Datenbanktypen kennenlernen.


Microsoft StreamInsight wurde speziell für die Verarbeitung von Datenereignissen entwickelt. Ich weiß nicht viel darüber, aber es sieht eher nach einer vollständigen und unabhängigen Plattform als nach einer einzelnen Funktion von SQL Server aus. Hier ist ein StreamInsight-Architekturdiagramm .
Nick Chammas

Antworten:


5

Service Broker für SQL Server 2005+ kann dies tun.

Leider bin ich mir anderer RDBMS nicht sicher


2
Können Sie näher erläutern, wie Service Broker dies tut? @rem fragt nach dem Abrufen ereignisgetriggerter (im Gegensatz zu zeitgetriggerten) Aktualisierungen aus einer Datenbank. SB ist für Warteschlangen und Asyc-Verarbeitung.
Nick Chammas

1
-1 In Service Broker ist anscheinend nichts integriert, um einer App mitzuteilen, dass sie eine Nachricht erhalten hat. (Ich bin derzeit auf dieses Problem stecken.)
Vaccano

10

In Oracle können Sie das integrierte DBMS_ALERT-Paket verwenden , um dies zu vereinfachen.

DBMS_ALERT unterstützt die asynchrone Benachrichtigung über Datenbankereignisse (Alerts). Durch die ordnungsgemäße Verwendung dieses Pakets und von Datenbank-Triggern kann sich eine Anwendung selbst benachrichtigen, wenn Werte von Interesse in der Datenbank geändert werden.

Angenommen, ein Grafiktool zeigt ein Diagramm einiger Daten aus einer Datenbanktabelle an. Das Grafiktool kann nach dem Lesen und Zeichnen der Daten auf einen Datenbankalert (WAITONE) warten, der die gerade gelesenen Daten abdeckt. Das Tool wird automatisch aktiviert, wenn die Daten von einem anderen Benutzer geändert werden. Alles, was erforderlich ist, ist, dass ein Trigger in die Datenbanktabelle gestellt wird, der bei jedem Auslösen des Triggers ein Signal (SIGNAL) abgibt.


Und für "MS SQL Server 2008" laut OPs Frage? Sie fragten nach anderen RDBMS, aber das hilft nicht wirklich.
4.

9
@gbn Warum hilft es nicht? Ich kann den SQL Server-Teil nicht wie Sie beantworten, also habe ich den Teil beantwortet, den ich konnte. Keiner ist Experte für alle anderen Datenbanken, aber wenn wir alle unser Wissen einbringen, werden das OP und zukünftige Besucher nützliche Informationen finden. Ich würde erwarten, dass das OP eine SQL Server-Antwort akzeptiert und andere nützliche Antworten wie ScottChers (+1) hochstimmt.
Leigh Riffel

gut gesagt. Nachdem ich Ihre Antwort auf DBMS_ALERT gelesen habe, habe ich eine andere Methode kennengelernt - mehr Tools für die Toolbox! +1
ScottCher

7

Bestimmte Datenbankanbieter bieten auch integrierte Nachrichtenbusse an, die Ihre App einfach abonnieren kann:

Eine Alternative wäre, die Daten in erster Linie über einen Nachrichtenbus wie Tibco / RV in die Datenbank zu leiten und sie einfach "zu verzweigen", im Datenstrom in die Datenbank und in Ihre Anwendung zu übertragen, oder eine Caching-Ebene wie Coherence zu verwenden zwischen Ihrer App und der DB.


7

LISTEN / NOTIFY für PostgreSQL

http://www.postgresql.org/docs/current/static/sql-notify.html

in der Datenbank ...

NOTIFY static_channel_name, 'static-message';

oder in einer Funktion / einem Trigger:

perform pg_notify('dynamic-channel-name', 'dynamic-message');

im Datenbank-Client:

LISTEN some_channel_name; --note the lack of quotes

Der LISTEN-Client erhält die PostgreSQL-Prozess-ID, den Kanalnamen und den Nachrichtenwert.

Der Standard-JDBC-Treiber für PostgreSQL mag keine Benachrichtigungen, Sie können jedoch den https://github.com/impossibl/pgjdbc-ng-Treiber für diesen Zweck verwenden


5

Eine weitere Oracle-Lösung: Wir haben Anwendungen unter Verwendung des Dotnet-Frameworks von Microsoft entwickelt, die die Database Change Notification- Funktion von Oracle in Verbindung mit ODP.Net (dem Oracle-Datenanbieter für Dotnet) nutzen. Auf diese Weise benachrichtigt die Datenbank die Dotnet-Anwendung, wenn neue Daten eingegangen sind, sodass wir keine ständigen Abfragen durchführen müssen. Der Link, auf den ich oben verweise, ist ein Oracle-Tutorial, um genau das zu tun. Hoffe das hilft dir weiter.

Kennen Sie keine anderen RDBMS.


2

Für eine unserer Anwendungen (auf die über Chrome und NUR Chrome zugegriffen wird) verwenden wir MySQL mit sys_exec UDF . Grundsätzlich, warum Chrome - aufgrund der WebSocket-Unterstützung.

Sobald ein kritisches Update / Insert / Delete auftritt, wird ein externes Programm über die neu hinzugefügte sys_exec-Funktionalität aufgerufen, die in bestimmte Trigger eingebettet ist. Zu diesem Zeitpunkt haben wir alles, was wir brauchen, um die Nachricht an jeden verbundenen Client weiterzuleiten, ohne dass Abfragen oder mehrere Abfragen erforderlich sind, da alles in Echtzeit erfolgt.


1

Wir verwenden eine Kombination aus Oracle GoldenGate und der Java Persistence API (JPA), um dies mit Oracle-Datenbanken, aber auch mit DB2, Sybase, Microsoft SQL Server, MySQL, Teradata usw. zu tun. Die Funktion wird hier beschrieben: http: // docs .oracle.com / middleware / 1212 / coherence / COHIG / golden_g.htm

GoldenGate wandelt das Datenbanktransaktionsprotokoll in einen filterbaren Ereignisstrom um, der überall im Netzwerk verwendet werden kann. Wir verwenden es, um relevante Transaktionen entweder in Cache-Aktualisierungen oder in Cache-Ungültigkeiten umzuwandeln. Beide können Ereignisse auf Anwendungsebene auslösen, z.

(Zur vollständigen Offenlegung arbeite ich bei Oracle an einem der Produkte, die GoldenGate verwenden.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.