Accélérer les opérations d'insertion en bloc avec NHibernate
Je veux accélérer en vrac insert
opérations avec NHibernate 3.2 sur Oracle 11g. Pour ce faire, j'ai essayé
Session.Save(entity);
Session.Flush();
Session.Clear();
... dans mon foreach
boucle, mais a obtenu une exception provoquée par des objets manquants dans la Session:
échoué paresseusement initialiser une collection de rôle: Maclasse.PropertyX, pas de session ou la session a été fermée
Une autre tentative a été de définir la taille de lot:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="connection.connection_string">xxx</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="adonet.batch_size">50</property>
<property name="query.substitutions">true=1, false=0</property>
<property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property>
</session-factory>
</hibernate-configuration>
de plus, j'ai mis Session.SetBatchSize(50)
dans mon code un a obtenu l'exception suivante:
Pas de la taille des lots a été défini pour la session de l'usine, de dosage est
désactivée. Ensemble adonet.batch_size = 1 pour activer le traitement par lots.
Le seul endroit où cette exception est levée est NonBatchingBatcherde sorte qu'il ressemble à ma session, a le tort de dosage.
Quel est le problème ici? Comment puis-je accélérer lot de plaquettes avec NHibernate (sans l'aide de statlese séances)?
source d'informationauteur deamon
Vous devez vous connecter pour publier un commentaire.
Suivante devrait fonctionner,
Ref : http://nhibernate.info/blog/2008/10/30/bulk-data-operations-with-nhibernate-s-stateless-sessions.html
Deuxième URL d'avoir de la peine à lire.
Tous les conseils ci-dessus sont très valable et très utile. Voulais ajouter un à la collection: désactiver la journalisation. Avoir votre SQL affichées dans la console vous ralentit sensiblement, comme le fait de profilage à l'aide NHProf, auto, commentant et assez en forme le SQL connecté via NLog ou log4net. Dans notre cas, le paramètre:
par une diminution de nos bulk insert temps de ~6 secondes pour un peu plus de 1 seconde. Ainsi, alors que l'enregistrement potentiellement vous aider à cerner les problèmes plus graves, il est livré avec un rendement frappé de sa propre!
Pourquoi êtes-vous de compensation de la session ?
Je pense que vous ne devriez pas clair de la session dans la boucle. Pour vous assurer que les modifications sont écrites dans la base de données, je préfère utiliser une transaction.
Pseudocode:
Pour accélérer les choses il y a d'autres choses qui peut vous aider, vous devez définir ce que vous voulez vraiment faire dans la boucle.
Je sais que la question a été sur Oracle mais pour SQL server j'allais écrire une routine de prendre les mappages de classe et de générer un DataTable à être utilisé par SqlBulkInsert, mais j'ai trouvé quelqu'un l'a déjà fait.
https://kaylaniam.wordpress.com/2015/03/13/nhibernate-and-sqlbulkcopy/
C'est probablement le moyen le plus rapide pour effectuer des insertions sur SQL Server.
Code ci-dessous fonctionne pour moi sur l'insertion de plusieurs entités composites
Vous allez avoir à créer une méthode pour remplir un objet DataTable de l'entité composite de l'objet que vous souhaitez persister.