C #, Dapper, SQL Server y agrupación de conexiones

c# connection-pooling dapper sql-server

Pregunta

He escrito un código para escribir algunos datos en SQL Server, usando Dapper. No necesito esperar a que se complete esta escritura antes de continuar con otro trabajo, así que quiero usar Task.Run () para hacer esto asíncrono.

Tengo (usando) declaraciones para llamar esto en el resto de mi sistema:

 using (IDataAccess ida = new DAL())
        {
            ida.WriteMessageToDB(id, routingKey, msgBody);
        }

Mi DAL comprobará automáticamente dbConnection.State cuando se ejecute la sentencia using e intentará una solución simple si está cerrada. Esto funciona bien para cualquier llamada de selección no asíncrona / TPL.

Sin embargo, cuando lanzo una carga de escrituras al mismo tiempo, el código de Task.Run () se estaba cayendo ya que la conexión estaba cerrada para algunos de ellos, esencialmente, creo que la naturaleza paralela del código significaba que el estado estaba siendo cerrado por otras tareas.

Lo "solucioné" haciendo un cheque para abrir Connection.State dentro del código Task.Run (), y esto parece haber "resuelto" el problema. Al igual que:

Task.Run(() =>
            {
                if (dbConnection.State == ConnectionState.Closed)
                {
                    dbConnection.Open();
                }

                if (dbConnection.State == ConnectionState.Open)
                {
                    *Dapper SQL String and Execute Commands*
                }
            });

Cuando ejecuto SELECT * FROM sys.dm_exec_connections de SSMS después de esto, veo muchas más conexiones. ¿Se espera?

Ahora, tal como lo entiendo:

  • Dapper no se ocupa de la agrupación de conexiones
  • SQL Server debería tratar automáticamente con la agrupación de conexiones?

¿Hay algo malo con esta solución? ¿O una mejor manera de hacerlo? Me gustaría utilizar la agrupación de conexiones por razones obvias, y de la forma más sencilla posible.

Gracias por adelantado.

Respuesta popular

Gracias Juharr: He votado a favor su respuesta.

Para referencia a otros, cambié la función de escritura para esperar y Dapper async:

private async Task WriteMessageToDB(Guid id, string tableName, string jsonString)
    {
            string sql = *Redacted*
            await dbConnection.ExecuteScalarAsync<int>(sql, new { ID = id, Body = jsonString });
    }

Y luego creó una nueva tarea en la persona que llama que monitorea el resultado.

Esto funciona de manera consistente bajo carga y no se crean conexiones nuevas excesivas.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué