2009-02-18 9 views
7

Bonjour, Je travaille sur un projet où nous devons traiter plusieurs fichiers xml une fois par jour et remplir une base de données avec les informations contenues dans ces fichiers.NHibernate bulk insert ou mise à jour

Chaque fichier fait environ 1 Mo et contient environ 1 000 enregistrements; nous avons généralement besoin de traiter entre 12 et 25 de ces fichiers. J'ai vu quelques informations concernant les insertions en vrac utilisant NHibernate mais notre problème est plus compliqué car les fichiers xml contiennent de nouveaux enregistrements mélangés avec des enregistrements mis à jour.

Dans le fichier XML, il y a un drapeau qui nous indique qu'un enregistrement spécifique est un nouveau ou une mise à jour d'un enregistrement existant, mais pas quelles informations ont changé. Les enregistrements xml ne contiennent pas notre identifiant de base de données, mais nous pouvons utiliser un identifiant de l'enregistrement xml pour localiser de manière unique un enregistrement dans notre base de données. Notre stratégie jusqu'ici a été d'identifier si l'enregistrement actuel est un insert ou une mise à jour et sur la base de ce que nous effectuons une insertion sur le DB ou nous faisons une recherche, puis nous mettons à jour les informations sur l'objet avec le informations provenant de l'enregistrement xml et enfin nous faisons une mise à jour sur la base de données. Le problème avec notre approche actuelle est que nous avons des problèmes avec les verrous DB et que nos performances se dégradent très rapidement. Nous avons réfléchi à des alternatives telles que des tables séparées pour les opérations distinctes ou même des DB séparés, mais faire un tel geste signifierait un gros effort donc avant toute décision, je voudrais demander l'avis de la communauté sur cette question, merci d'avance.

Répondre

17

Quelques idées:

  • Toujours essayer d'utiliser IStatelessSession pour les opérations en vrac.
  • Si vous n'êtes toujours pas satisfait de la performance, sautez NHibernate et utiliser un spécifique à cette requête ou procédure stockée paramétrée, ou utilisez IQuery.ExecuteUpdate()
  • Si vous utilisez SQL Server, vous pouvez convertir votre format XML BCPFORMAT xml alors exécutez BULK INSERT dessus (seulement pour les insertions)
  • Si vous avez trop de verrous DB, essayez de regrouper les opérations (c'est-à-dire d'abord savoir ce qui doit être inséré et mis à jour, puis obtenir des PK pour les mises à jour , puis exécutez BULK INSERT pour les insertions, puis exécutez les mises à jour)
  • Si l'analyse des fichiers source est un problème de performances (c'est-à-dire qu'il dépasse un cœur de processeur), essayez de le faire en parallèle (vous pouvez utiliser Parallel Extensions)
Questions connexes