2009-04-15 3 views
1

J'ai un processus qui lit les données brutes et les écrit dans une base de données toutes les quelques secondes.Le moyen le plus compatible pour écouter les changements de base de données?

Quelle est la meilleure façon de savoir si la base de données a été écrite? Je sais qu'Oracle et MS-SQL peuvent utiliser des déclencheurs ou quelque chose pour communiquer avec d'autres services, mais j'espérais qu'il y aurait une technique qui fonctionnerait avec plus de types de bases de données SQL (SQL lite, MySQL, PostGRES).

Répondre

1

Votre question manque de détails spécifiques pour une bonne réponse, mais je vais essayer. Les déclencheurs sont utiles pour les tables de ciblage, mais si vous êtes intéressé par les écritures à l'échelle du système, vous aurez besoin d'une meilleure méthode, plus facile à gérer. Pour les écritures à l'échelle du système, j'étudierais les méthodes qui détectent les changements dans le journal des transactions. Malheureusement, chaque fournisseur implémente cette partie différemment, donc une méthode qui fonctionne pour tous les fournisseurs est peu probable. Autrement dit, une méthode qui fonctionne dans le serveur de base de données est peu probable. Mais il peut y avoir des manières plus élégantes en dehors du serveur au niveau du système d'exploitation. Par exemple, si le journal des transactions est un fichier sur le disque, un script simple qui détecte les modifications dans le fichier indique que la base de données a été écrite. N'oubliez pas que vous avez demandé uniquement de détecter une écriture DB. Si vous avez besoin de savoir de quel type d'écriture il s'agit, vous devrez entrer dans le journal des transactions pour voir ce qu'il y a. Et ce sera certainement spécifique au vendeur.

0

Cela dépend de ce que vous voulez faire. Si c'est quelque chose d'extérieur à la base de données qui doit être lancé, un simple sondage de la base de données ferait l'affaire, sinon un déclencheur spécifique à la base de données est probablement le meilleur.

+0

J'espérais une solution non-polling, mais je ne suis pas sûr qu'il y en ait une qui puisse être généralisée. – CookieOfFortune

0

Si vous voulez être indépendant de la base de données, l'interrogation peut fonctionner. Ce n'est pas très efficace ou élégant. Cela fonctionne également si vous êtes maudit d'utiliser une base de données qui ne supporte pas les triggers. Une solution de contournement que nous avons utilisée dans le passé est d'utiliser un script qui est chronométré (disons via cron) pour faire un select MAX(primary_key_id) from saidTable. Je suppose que votre clé primaire est un entier séquentiel et est indexée.

Ensuite, comparez-le à la valeur que vous avez obtenue la dernière fois que vous avez exécuté le script. Si elles correspondent, dites au script de quitter ou de dormir. Sinon, fais ton truc.

Il y a d'autres problèmes avec cette approche (c'est-à-dire: les retards si le script prend trop de temps, ou les problèmes de concurrence, etc.). Et bien sûr, la performance peut aussi devenir un problème!

Questions connexes