Enregistrement de plus de 1000 enregistrements dans la base de données à la fois
Je suis en utilisant NHibernate actuellement. J'ai une situation où j'ai besoin d'enregistrer un tas de documents à la base de données comme ceci:
var relatedTopics = GetRelatedTopics(topic);
foreach (var relatedTopic in relatedTopics /* could be anywhere from 10 - 1000+ */)
{
var newRelatedTopic = new RelatedTopic { RelatedTopicUrl = relatedTopic, TopicUrl = topic.Name };
_repository.Save(newRelatedTopic);
}
Quand il ya une tonne de dossiers à sauvegarder, ce n'est évidemment pénible d'avoir à frapper, la base de données à de nombreuses reprises. Ce qui est une meilleure approche? Est-il une sorte de mise à jour par lot que je peux faire? Suis-je mieux d'utiliser un DataSet?
Grâce
source d'informationauteur Micah
Vous devez vous connecter pour publier un commentaire.
réglage de l'adonet.batch_size pourrait améliorer la situation.
Pour que vous avez à
Exemple:
définir la taille de lot sur la session juste avant de l'enregistrer
Je crois que c'est ce que vous cherchez:
De Données en vrac Opérations Avec NHibernate Apatrides Sessions
Essentiellement au lieu de l'ouverture d'un ISession, vous ouvrez un IStatelessSession, et dans votre hibernate.cfg.xml vous pouvez définir:
Je pense que vous avez un certain nombre d'options en fonction de votre situation.
Si vous pouvez utiliser NHibernate 2.1 alphas, vous pouvez essayer d'utiliser le nouveau fichier Exécutable HQL qui est disponible.
http://nhibernate.info/blog/2009/05/05/nh2-1-executable-hql.html
Tobias réponse fonctionnera aussi bien. Il suffit de régler la taille du lot pour augmenter les performances de manière respectable.
Si vous voulez salir les mains avec ADO.Net...
Faire des Insertions dans Sql Server est possible grâce à l'utilisation de Sql Copie en bloc.
Un exemple est ici: http://dotnetslackers.com/articles/ado_net/SqlBulkCopy_in_ADO_NET_2_0.aspx
Pour moi, il semble que vous êtes en train de créer une nouvelle entité à partir d'une autre entité dans la base de données. Pour moi, cela ressemble à un scénario idéal pour l'utilisation d'une procédure stockée.
DataSet? Pas de.
Bulk Insert? Oui.
Si vous insérez que de nombreux enregistrements et les inserts sont assez simplistes, vous devriez chercher à faire des Insertions et en tirant l'ORM.
Le moyen le plus rapide pour insérer des enregistrements est de générer un fichier texte et l'utilisation de CHARGER le FICHIER de syntaxe. La plupart des bases de données ont remarquablement rapide implémentations de l'importation de fichiers de données dans les bases de données. Pour MySQL, voir ci-dessous:
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
Pour d'autres bases de données, reportez-vous au manuel approprié. Ceci est utile si vous insérez un million d'enregistrements, ou des milliers de dossiers fréquemment. Sinon, le meilleur que vous pouvez faire est de créer un grand SQL avec le 1000s de plaquettes et de l'exécuter sur votre connexion de base de données directement, en sautant d'Orm et de leurs validations.