¿Cuáles son las reglas de cómo un contexto de datos linq-a-sql mantiene abierta la conexión de la base de datos?Gestión de conexión de base de datos de contexto de linq a sql
La pregunta surgió cuando hicimos algunas pruebas de rendimiento para un SubmitChanges()
por entidad actualizada en lugar de un SubmitChanges()
para todo el lote de entidades. Resultados:
Inserción 3000 artículos en una SubmitChanges() llamar ... Duración: 1318ms
Inserción de 3000 artículos en una SubmitChanges() de llamada, dentro TransactionScope ... Duración: 1280ms
Inserción de 3000 artículos en SubmitChanges individuales() llama ... Duración: 4377ms
inserción de artículos en 3000 SubmitChanges individuales() llama dentro de una transacción ... Duración: 2901ms
Tenga en cuenta que cuando se hace individuo SubmitChanges()
para cada entidad cambiada, poner todo dentro de una transacción mejora el rendimiento, lo cual fue bastante inesperado para nosotros. En el analizador de servidor sql podemos ver que las llamadas individuales SubmitChanges()
dentro de la transacción no restablecen la conexión de base de datos para cada llamada, a diferencia de la que no tiene la transacción.
¿En qué casos el contexto de datos mantiene la conexión abierta? ¿Hay alguna documentación detallada disponible sobre cómo maneja linq-to-sql las conexiones?
El DataContext rastrea los objetos cambiados, pero en el código generado por defecto (por dbml designer en este caso) usa INotifyPropertyChanging e INotifyPropertyChanged. Con los implementados, no hay necesidad de recorrer todos los objetos. De todos modos, tienes razón en que la cantidad de entidades rastreadas crece. –