2017-10-05 8 views
1

J'ai un projet java qui est empaqueté en tant que jar and run. Le code interagit avec 2 bases de données, une base de données primaire et une base de données secondaire. Une table X existe dans les deux DB primaire et secondaire avec la même structure. Un thread Java dans le code utilise une file d'attente de blocage liée et dans cette file d'attente chaque requête DML qui s'exécute sur la table X dans le DB principal est ajoutée. Le thread continue de vérifier si un nouvel objet de requête DML a été ajouté à la file d'attente et l'exécute de la même manière sur la base de données secondaire. À la fin de la journée, l'exigence est de supprimer toutes les lignes du tableau X pour un jour donné, mais avant de réconcilier la table X dans les bases de données et dans le cas où les lignes ne correspondent pas, les lignes manquantes sont insérées DB, puis supprimé de la base de données principale.Nettoyer le thread/le thread d'arrière-plan ou le processus/le service en Java

Ici, je suis face à 2 problèmes:

Le premier problème est, comme le nombre de requêtes DML ajouté à la file d'attente augmente, l'exécution de ces requêtes devient lente. Deuxièmement, si le fichier est arrêté et redémarré, les requêtes DML qui ont été ajoutées à la file mais qui n'ont pas encore été exécutées sont perdues parce que la file d'attente est en mémoire et que ces lignes ne sont jamais déplacées dans la base de données secondaire. Ce que je cherche est une approche dans laquelle je peux concevoir soit un service d'arrière-plan ou un service externe qui continue à fonctionner indépendamment du fait que le jar principal est en cours ou arrêté et continue à effectuer le travail de réplication des requêtes DML de la base de données primaire à la base de données secondaire.

+0

Comme 'cron' sous Linux ou Windows' Task Scheduler'? –

Répondre

0

J'ai eu cette idée qui pourrait se faire soit en plus ou comme alternative à un service de fond:

En supposant vos opérations de base de données sont beaucoup plus lourds que l'insertion d'une chaîne simple dans un petit DB, vous pouvez insérer les requêtes dans une base de données en texte brut et supprimez-les lors de l'exécution. De cette façon, si quelque chose se bloque en cours de route, vous pouvez reprendre la file d'attente de requêtes où elle se trouvait. La file d'attente elle-même devient persistante ... On pourrait avoir quelque chose comme ceci:

Générateur de requêtes> Requête DB> Service d'exécution de la requête> Finale DB

Deuxièmement, vous dites « que le nombre de requêtes DML ajouté à la file d'attente augmente, l'exécution de ces requêtes devient lente ". Comment votre file d'attente de requêtes peut-elle être si lourde? Peut-être que vous devriez vérifier les fuites de mémoire possibles.