Les meilleures pratiques pour l'insertion et l'interrogation des données de la mémoire

StackOverflow https://stackoverflow.com/questions/3178628

  •  02-10-2019
  •  | 
  •  

Question

Nous avons une application qui prend des données en temps réel et l'insère dans la base de données. il est en ligne pendant 4,5 heures par jour. Nous insérons deuxième de données par seconde dans 17 tableaux. L'utilisateur à tout moment peut interroger une table pour les dernières secondes données et certains record dans l'histoire ...

Manipulation de l'alimentation et l'insertion est effectuée en utilisant une application de console C # ...

Manipulation des demandes des utilisateurs se fait par un service WCF ...

Nous avons pensé que l'insertion est notre goulot d'étranglement; la plupart du temps est pris là. Nous avons investi beaucoup de temps à essayer de les tables et finetune ees, mais les résultats ne sont pas satisfaisants

En supposant que nous avons la mémoire suffecient, quelle est la meilleure pratique pour insérer des données dans la mémoire au lieu de la base de données ayant. À l'heure actuelle, nous utilisons datatables qui sont mis à jour et chaque seconde insérés Une de nos collègues a suggéré un autre service WCF au lieu de la base de données entre le gestionnaire d'alimentation et le WCF demandes-User-gestionnaire. La couche intermédiaire WCF est censé être basé sur TCP et il conserve les données dans sa propre mémoire. On peut dire que le gestionnaire d'alimentation peut traiter les demandes d'utilisateurs au lieu d'avoir une couche intermédiaire entre 2 processus, mais nous voulons des choses séparées si l'on veut se bloque-gestionnaire d'alimentation pour pouvoir encore fournir à l'utilisateur les dossiers en cours

Nous sommes limités dans le temps, et nous voulons déplacer tout à mémoire courte période. Le fait d'avoir un WCF au milieu de 2 traite une mauvaise chose à faire? Je sais que les demandes ajouter certains frais généraux, mais tous ces 3 processus (alimentation gestionnaire, Dans la base de données de mémoire (WCF), vont être sur la même machine demande utilisateur-gestionnaire (WCF) et la bande passante ne sera pas beaucoup d'un problème.

S'il vous plaît aider!

Était-ce utile?

La solution

J'étudierait la création d'un cache des données (que vous pouvez également réduire la base de données sélectionne), et les données d'invalidation dans le cache une fois qu'il a été écrit à la base de données. De cette façon, vous pouvez traiter en lots des appels à faire une plus grande insertion au lieu de beaucoup plus petits, mais conserver les données en mémoire telles que les lecteurs puissent le lire. En fait, si vous savez quand les données rassit, vous pouvez éviter de lire la base de données entièrement et l'utiliser comme un magasin de soutien -. De cette façon, les performances de la base de données n'affectera la taille de votre cache obtient

données Invalidation dans le cache sera soit basée sur si son écrit à la base de données ou de son parti rassis, qui vient toujours dernier , pas d'abord.

La couche de cache n'a pas besoin d'être compliqué, mais il devrait être multi-thread pour accueillir les données et également l'enregistrer en arrière-plan. Cette couche s'asseyait juste derrière le service WCF, le moyen de connexion et le service WCF doit être amélioré pour contenir la logique de l'application de la console + l'idée de mise en lots. Ensuite, l'application de la console peut simplement se connecter à WCF et jeter les résultats dans ce domaine.

Mise à jour: la seule chose à dire est d'investir dans un profileur pour voir si vous présentez des problèmes de performance dans le code qui sont masquées. En outre, le profil de votre base de données. Vous mentionnez que vous avez besoin insertions rapides et sélectionne - malheureusement, ils Compromis généralement les uns contre les autres ...

Autres conseils

Quel genre de base de données utilisez-vous? MySQL dispose d'un moteur de stockage mémoire qui semble être adapté à ce genre de chose.

Utilisez-vous DataTable avec DataAdapter? Si oui, je vous recommande de les supprimer complètement. Insérez vos dossiers directement à l'aide DBCommand. Lorsque les utilisateurs demandent des rapports, lire les données à l'aide DataReader ou remplir des objets DataTable en utilisant DataTable.Load (IDataReader).

données Storying en mémoire a le risque de perte de données en cas d'accidents ou de pannes de courant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top