comment effectuer une opération par lot avec dapper orm?

batch-file bulk dapper orm

Question

J'ai dapper orm dans le projet et j'ai sauvegardé alto de données (1200000row) dans la base de données, mais en transaction avec dapper est très lent je veux rapide.avec nhibernate (session statetless) est lente. Je pense que Dapper est rapide car cela récupère des données (700000) avec nhibernate en 33 secondes avec dapper en 9 secondes.

Comment résoudre le problème?

mon code est:

IDbTransaction trans = connection.BeginTransaction();
connection.Execute(@"
    insert DailyResult(Id, PersonId,DateTaradod,DailyTaradods)
    values(@Id, @PersonId,@DateTaradod,@DailyTaradods)", entity, trans);                                    
trans.Commit();

Réponse d'expert

Il n'y a pas de mécanisme permettant d'insérer 1 200 000 lignes dans un instant de transaction, via une API ADO.NET standard. Ce n'est simplement pas l'intention de cette API .

Pour ce que vous voulez, il semble que vous devriez utiliser SqlBulkCopy . Cela prend en charge les transactions et vous pouvez utiliser FastMember pour aider ici; par exemple:

IEnumerable<YourEntity> source = ...
using(var bcp = new SqlBulkCopy(
    connection, SqlBulkCopyOptions.UseInternalTransaction))
using(var reader = ObjectReader.Create(source,
         "Id", "PersonId", "DateTaradod", "DailyTaradods"))
{
    bcp.DestinationTableName = "DailyResult";
    bcp.WriteToServer(reader);
}

Il prend également en charge les transactions externes , mais si vous envisagez de "créer, transférer, valider", vous pouvez aussi utiliser la transaction interne.

Si vous ne souhaitez pas utiliser SqlBulkCopy , vous pouvez également examiner les approches de paramètre de valeur table, mais SqlBulkCopy serait mon API recommandée pour traiter ce volume.

Remarque: si la table a plus de colonnes que Id , PersonId , DateTaradod et DailyTaradods , vous pouvez spécifier explicitement bcp.ColumnMappings pour modifier le comportement de l'insertion.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi