notfication an verbundene user

Hallo erstmal,

ich hoffe ihr könnt mir bei meinem Problem helfen.

Problem:
Ich habe ein Serverprogramm in Java geschrieben das in verschiedenen Abständen Updates und Inserts in einer Datenbank ausführt.

Nun möchte ich die Clients (auch in Java geschrieben) die mit der Datenabnk verbunden sind benachrichtigen, sobald sich etwas in der Datenbank geändert hat.

Ist das mit PostgreSQL möglich?
Wie stelle ich das an?

Dankeschön im voraus.

Hallo bastel,

nein, PostgreSQL versendet keinen Message.


E-Mails versenden oder der Client liefert die Message!



mfg

fristo

Du könntest in der DB eine Counter (oder einen PK aus deiner Tabellen-Struktur, der sich dazu eignet) mitziehen und einen extra Thread der Serverapplikation in best. Abständen auf den Counter pollen lassen, ob er sich geändert hat. Wenn ja->Message an Client.

Pass aber auf, bei sowas kannst du schnell massiv Last generieren (je nach Anzahl der verbundenen Clients oder Polling-Intervall)

Domski

Ein großes Dankeschön für eure schnellen Antworten!

Das der Client die Message liefert wollte ich über Sockets machen.
Insgesamt finde ich das aber recht aufwendig und es wird eine weitere Verbindung aufgemacht.

Mit der Tabelle und nem counter würde ich das umgehen.
Es ist dann immerhin nur ein SELECT das von den Clients ausgeführt wird.
Da ich eine überschaubare Anzahl an Clinets (max. 10) habe dürfte die Performance nicht merklich sinken.

Ansonten wäre vielleicht JAVA - RMI noch ein Thema.
Dankeschön für eure Hilfe.

Das Problem ist nicht, wie du die Message vom Applikationsserver an den Client bekommst, da gibt es viele Möglichkeiten und ich würde die wählen, die sich am einfachsten in die restliche Kommunikation einfügt.

Du musst ja erstmal von der DB die Information, das eine Änderung erfolgt ist, an den Server bekommen. Ich würde da vielleicht sogar mit timestamps der letzten Transaktion arbeiten.

Mal ne andere Frage, kannst du in deinem App-Server nicht eine Zwischenschicht für den DB-Zugriff programmieren, über die alle Transaktionen laufen und die auch die Client-Notification verwaltet? Da wäre Postgres komplett aussen vor, geht aber nur, wenn definitiv nur der eine App-Server auf die DB zugreift.

Du musst ja erstmal von der DB die Information, das eine Änderung erfolgt ist, an den Server bekommen. Ich würde da vielleicht sogar mit timestamps der letzten Transaktion arbeiten.

Das was das ganze etwas einfacher macht ist das allein die Server-Applikation in die Datenbank schreibt. Die Clients werden nie Änderungen an der Datenbank vornehmen.

Du musst ja erstmal von der DB die Information, das eine Änderung erfolgt ist, an den Server bekommen. Ich würde da vielleicht sogar mit timestamps der letzten Transaktion arbeiten.

Das könnte ich doch mit einem Trigger machen, abgesehen davon das meine Server-Applikation weiß wenn sie in die Datenbank schreibt.

Mal ne andere Frage, kannst du in deinem App-Server nicht eine Zwischenschicht für den DB-Zugriff programmieren, über die alle Transaktionen laufen und die auch die Client-Notification verwaltet? Da wäre Postgres komplett aussen vor, geht aber nur, wenn definitiv nur der eine App-Server auf die DB zugreift.

Das wäre ja prinzipiell die Sache mit JAVA-RMI.
Unangenehm ist mir nur, dass ich eine Zweite Verbindung zwischen den Programmen aufmachen muss. Da diese auf einer ganz anderen Basis kommunizieren habe ich zwei Verbindungen die einwandfrei funktionieren müssen. Das Risiko eines Fehlers erhöht sich somit.

Solange genau eine Anwendung (egal ob deine Server-App, Client, Konsolenzugriff, etc) auf der Datenbank zugreift, würde ich den Client-Refresh ausschlieslich in der Server-App realisieren. Nur wenn 2 oder mehr voneinander unabhänhige Server-Apps aktiv sind, klappt das eben nicht mehr. Dann muss die Server-App in best. Zeitabständen auf die DB pollen und schauen, ob der intern gespeicherte Status und der Status der DB noch identisch sind. Wenn nicht, wird ein Client-Refresh gestartet.

Würde ich nicht sagen, ob ein oder 2 RMI-Verbindungen offen sind, hat lediglich Einfluss auf die Performance. Kommunizieren Client und Server nur unidirektional?

Wesentlich störanfälliger wäre es, zwei verschiedene Technologien in der selben App zu benutzen. Entweder RMI läuft oder es läuft eben nicht und ob ein oder 2 Verbindungen offen sind, das juckt die Kisten nicht.

Moin.

Schau Dir mal Kapitel zu LISTEN/NOTIFY im Handbuch an.

Ich denke mal, das hilft Dir weiter.