2017-10-05 1 views
1

Ich habe ein Java-Projekt, das als ein Glas verpackt und ausgeführt wird. Der Code interagiert mit 2 Datenbanken, einer Primärdatenbank und einer Sekundärdatenbank. Eine Tabelle X existiert sowohl im primären als auch im sekundären DB mit derselben Struktur.Aufräumen Thread/Hintergrund Thread oder Prozess/Service In Java

Ein Java-Thread im Code verwendet eine verknüpfte blockierende Warteschlange, und zu dieser Warteschlange wird jede DML-Abfrage hinzugefügt, die in der primären Datenbank in Tabelle X ausgeführt wird. Der Thread überprüft, ob der Warteschlange ein neues DML-Abfrageobjekt hinzugefügt wurde, und führt dasselbe in der sekundären Datenbank aus.

Am Ende des Tages ist die Anforderung, alle Zeilen in Tabelle X für einen bestimmten Tag zu löschen, aber davor stimmen wir die Tabelle X in beiden Datenbanken ab, und im Fall der Anzahl der Zeilen stimmen die fehlenden Zeilen zuerst in der sekundären Zeile überein DB und dann aus der primären DB gelöscht.

Hier bin ich mit Blick auf 2 Probleme:

Das erste Problem ist, da die Anzahl der DML-Abfragen an die Warteschlange erhöht hinzugefügt, die Ausführung dieser Abfragen langsam wird.

Zweitens, wenn das Jar gestoppt und erneut neu gestartet wird, die DML-Abfragen, die zur Warteschlange hinzugefügt wurden, aber noch nicht ausgeführt wurden, sind verloren, da die Warteschlange im Arbeitsspeicher ist und diese Zeilen nie in sekundäre DB verschoben werden.

Was ich suche, ist ein Ansatz, in dem ich entweder einen Hintergrunddienst oder einen externen Dienst entwerfen kann, der unabhängig davon weiterläuft, ob das Haupt-jar ausgeführt oder gestoppt wird und weiterhin die Replikation der DML-Abfragen ausführt vom primären DB zum sekundären DB.

+0

Wie 'cron' auf Linux oder Windows' Task Scheduler'? –

Antwort

0

ich diese Idee hatte, die entweder zusätzlich oder als Alternative zu den Hintergrunddienst getan werden könnte:

Ihre Datenbankoperationen sind viel schwerer als eine einfache Zeichenfolge in einer kleinen DB einfügen, können Sie die Abfragen

Gesetzt einfügen in einer Datenbank als Nur-Text und entfernen Sie sie bei der Ausführung. Auf diese Weise können Sie, wenn etwas auf dem Weg abstürzt, die Abfragewarteschlange wieder aufnehmen, wo sie war. Die Warteschlange selbst persistant wird ... Wir könnten so etwas wie dieses:

Abfragegenerator> Abfrage DB> Abfrageausführung Service> Abschluss DB

Zweitens Sie sagen, „wie die Anzahl der DML-Abfragen der Warteschlange hinzugefügt erhöht, wird die Ausführung dieser Abfragen langsam ". Wie kann Ihre Abfragewarteschlange so schwer sein? Vielleicht sollten Sie nach möglichen Speicherlecks suchen.