¿Cómo se realiza la operación por lotes con Dapper orm?

batch-file bulk dapper orm

Pregunta

Tengo dapper orm en proyecto y tengo guardar alto de datos (1200000row) en la base de datos, pero en la transacción con dapper es muy lento, quiero fast.with nhibernate (session statetless) es lento. Creo que dapper es rápido porque esa información de búsqueda (700000) con nhibernate en 33 segundos que con dapper en 9 segundos.

¿cómo se solucionó el problema?

mi código es:

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

Respuesta experta

No hay ningún mecanismo para hacer la inserción de 1200000 filas en una transacción instantánea, a través de cualquier API ADO.NET normal. Simplemente, esa no es la intención de esa API .

Para lo que quieras, parece que deberías estar usando SqlBulkCopy . Esto admite transacciones, y puede usar FastMember para ayudar aquí; por ejemplo:

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);
}

También admite transacciones externas , pero si va a "crear tran, push, commit tran", también podría usar la transacción interna.

Si no desea usar SqlBulkCopy , también puede ver los enfoques de parámetros de tabla-valor, pero SqlBulkCopy sería mi API recomendada cuando se trata de este volumen.

Nota: si la tabla tiene más columnas que Id , PersonId , DateTaradod y DailyTaradods , puede especificar bcp.ColumnMappings explícitos para modificar cómo se comporta la inserción.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow