2010-03-19 5 views
1

Je dois sauvegarder des milliers d'enregistrements dans une base de données. J'utilise CastleProject ActiveRecord. Le cycle qui stocke cette quantité d'objets fonctionne trop longtemps.Sauvegarde par lots dans CastleProject ActiveRecord

Est-il possible d'exécuter l'enregistrement dans un lot en utilisant ActiveRecord? Quelle est la méthode recommandée pour améliorer les performances? ActiveRecord (et la plupart des ORM) ne sont pas adaptés aux opérations par lots.

Répondre

1

Il semble que j'ai trouvé la solution. Il y a deux étapes principales:

  1. Ajouter un fichier de configuration à batching: < add key = "hibernate.batch_size" value = "100"/>
  2. Utilisez TransactionScope autour d'enregistrer vos objets:

using (TransactionScope scope = new TransactionScope()) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
    Contact contact = new Contact(); 
    contact.Save(); 
    } 
} 
0

Avec tout le suivi des changements qui se passe à l'intérieur d'un ORM, il peut vraiment vous ralentir.

Pour des performances optimales, j'utiliserais ADO.NET directement ou une sorte d'importation en bloc SQL.

+0

ActiveRecord a diverses options concernant les opérations de traitement par lots pendant le chargement. J'espère qu'ils ont quelque chose pour l'épargne de lot. Sinon, comment puis-je coupler ADO.NET et A.R.? – Alex

+0

J'ai trouvé le lien (http://davybrion.com/blog/2008/10/batching-nhibernates-dm-statements/) où une approche est décrite pour indiquer à NHibernate d'utiliser le batching. Cependant, dans les commentaires quelqu'un mentionne que cela ne fonctionne pas avec SQLite (la base de données utilisée dans mon programme). Il semble que je devrais demander aux gars de NHibernate pour le statut de ceci. – Alex

0
+0

Merci pour vos liens, Mauricio. Cependant, je pense que ma solution (qui est ci-dessous) fonctionne bien et fait ce que je voulais. J'ai testé cela en économisant 100 classes et en améliorant la performance 20 fois! – Alex