J'ai une machine qui crée un nouveau file journal au début de la journée (12h) et met à jour le file journal chaque fois qu'il y a des changements jusqu'à la fin de la journée.
Merci beaucoup
Vous pouvez save chaque nouvelle ligne avec un horodatage inversé.
Étant donné que vous devez vous connecter uniquement lorsque le file change, vous pouvez implémenter une queue en memory qui lit le file et stocke datatables. Ensuite, implémentez un model de consommateur producteur dans lequel un thread lit et charge des données de la queue et le consommateur se connecte à la database. Un service Windows peut ensuite continuer à lire dans la queue et se connecter au server SQL. (Puisque c'est un consommateur producteur, il n'y aura pas d'attente en cas d'attente de la queue)
D'une manière ou d'une autre, vous devrez également notifier le thread du producteur à chaque fois que chaque journal est créé. Cela peut être fait via Sockets / ou d'autres moyens au cas où vous auriez access au code qui effectue la journalisation.
Si vous n'avez aucun contrôle sur l'application qui produit le file, vous n'avez pas d'autre choix que d'interroger le file. Ecrire une application qui interroge régulièrement le file et écrit les deltas dans la database. L'application devra save une haute marque d'eau à laquelle elle a été lue pour la dernière fois.
Un autre problème est que si l'application ne ferme pas le file entre les écritures, il se peut que le dernier horodatage consulté ne soit pas mis à jour. Il est donc possible que la vérification de l'ancienneté du file ne soit pas fiable. Dans ce cas, vous devez implémenter quelque chose comme ce process:
Vous devrez vous assurer que le nombre d'octets lus correspond à votre position de search de file. Si le file journal est unicode, il peut ne pas avoir un mappage 1: 1 entre les octets et les caractères. Vous devrez peut-être lire des morceaux du file en mode binary et faire la traduction en caractères à partir du tampon.
Une fois les inputs du file journal analysées, vous pouvez simplement insert datatables ou utiliser SQLBulkCopy pour les volumes de données plus volumineux.
Si vous pouvez relâcher vos contraintes de latence et que le file journal est suffisamment petit, vous pouvez simplement implémenter un process qui copy le file journal dans une zone de transit et recharge le tout périodiquement.
Que diriez-vous d'un packageage SSIS appelé par un travail planifié SQL Server?