Requêtes de database multithread

Nous avons donc ce fournisseur d' échec ultime (c'est une longue histoire, mais croyez-moi ici) qui a créé une application qui a des bases de données séparées, mais de design identique, que nous devons interroger (10 d'entre eux réellement). Chacune de ces bases de données est destinée à un "location" différent – mais toutes les informations restnt pertinentes pour tous les sites.

J'ai écrit du code pour démarrer 10 threads uniques afin d'envoyer des requêtes à chacune des bases de données séparées, d'attendre la fin des résultats, puis de les combiner en un seul jeu d'loggings pouvant être manipulés.

La question ici est de savoir s'il y a un risque de lire 10 bases de données distinctes, en utilisant les mêmes informations d'identification pour chacune d'entre elles, toutes en même time?

Je prévois que cela ne devrait pas poser de problème puisque les bases de données peuvent avoir des centaines de connections à tout moment, mais je voulais get des commentaires avant de m'engager dans cette design.

MS-SQL si vous êtes curieux

En supposant que les bases de données sont indépendantes, le plus grand risque que je peux voir est que vous obtiendrez des vues d'un point différent dans le time pour chaque database. Cela peut être un problème, ou vous pouvez le résoudre en restreignant l'set de résultats en fonction d'un critère temporel.

Avoir un seul process ouvre 10 connections de database et les interroger ne présente aucun risque en soi.

Une autre option, beaucoup plus complexe, consisterait à configurer la réplication avec un seul maître et les 10 DB comme esclaves. Ceci dépend de la database et peut ou non être faisable / raisonnable.

Comme une opération unique vous pouvez exécuter 10 requêtes dans 10 threads (comme vous le faites), vous pouvez exécuter 10 requêtes sans threads explicites en utilisant les methods async BeginExecuteReader , vous pouvez agréger la requête en une seule via UNION ALL (comme Alex suggère) si tous les DB sont locaux, vous pouvez même jouer avec la procédure système sp_msforeachdb non documentée mais bien connue. Celui que je reorderais contre est, si les bases de données sont séparées, l'utilisation de servers liés. Les servers liés induisent des dependencies de disponibilité qui peuvent faire mal pendant les opérations (c'est-à-dire qu'un lien est en panne, votre rapport est en panne).

Si ce n'est que l'une des nombreuses fois où vous devez le faire, pour de nombreuses autres requêtes et rapports, il est peut-être utile d'agréger datatables pour la génération de rapports, par exemple par réplication, dans une seule database.

En outre, ne connaissant pas d'autres problèmes avec ledit fournisseur, la pratique consistant à séparer les «business units» sur une database séparée est assez courante, et dans la balance des efforts de développement (= prix), l'utilisation courante des applications est souvent la bonne pratique. .

Il pourrait être plus simple de laisser le server faire tout le travail pour vous, comme ceci:

SELECT col1, col2 FROM Database1.dbo.SomeTable WHERE <some conditions here> UNION ALL SELECT col1, col2 FROM Database2.dbo.SomeTable WHERE <some conditions here> (snip) UNION ALL SELECT col1, col2 FROM Database10.dbo.SomeTable WHERE <some conditions here> 

Pas de threads multiples, beaucoup plus simple. Cela ne devrait être utilisé que si toutes vos bases de données sont sur la même instance

Vous pouvez également envisager de mettre en place des servers liés et d'effectuer l'interrogation dans une seule grande déclaration. Je testerais les deux façons pour voir lequel est le plus efficace. De plus, avec les servers liés, tout échouera si l'un des servers est arrêté pour une raison quelconque. Selon vos besoins, cela peut ou non être un plus.

édité pour append Si elles sont toutes sur le même server, vous n'avez pas besoin de faire cela, il suffit d'exécuter une requête union union toutes les requêtes qui referencent chaque database.