C #, Dapper, SQL Server 및 연결 풀링

c# connection-pooling dapper sql-server

문제

Dapper를 사용하여 SQL Server에 데이터를 쓰는 코드를 작성했습니다. 다른 작업을 계속하기 전에이 쓰기가 완료 될 때까지 기다릴 필요가 없으므로 Task.Run ()을 사용하여 비동기로 만들려고합니다.

나는 내 시스템의 나머지 부분에서이를 호출하기 위해 다음과 같은 문장을 사용했다.

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

내 DAL은 using 문이 실행될 때 dbConnection.State를 자동으로 확인하고 닫으면 간단한 수정을 시도합니다. 이것은 비동기 / TPL 선택 호출에 대해서는 정상적으로 작동합니다.

그러나 내가 동시에 쓰기로드를 던질 때 Task.Run () 코드는 연결이 끊어져서 넘어져서 일부는 닫혔습니다. 본질적으로 코드의 병렬 특성으로 인해 상태가 닫혔다는 것을 의미한다고 생각합니다. 다른 작업.

나는 Task.Run () 코드 내에서 Connection.State를 열어서이 문제를 '해결'한 것으로 보입니다. 이렇게 :

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

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

이 후에 SSMS에서 SELECT * FROM sys.dm_exec_connections 를 실행하면 더 많은 연결이 표시됩니다. 예상되는?

지금 나는 그것을 이해한다 :

  • Dapper는 연결 풀링을 처리하지 않습니다.
  • SQL Server는 자동으로 연결 풀링을 처리해야합니까?

이 솔루션에 문제가 있습니까? 아니면 그것을하는 더 좋은 방법? 명백한 이유로 연결 풀링을 사용하고 싶지만 가능한 한 고통없이 사용하고 싶습니다.

미리 감사드립니다.

인기 답변

Juharr에게 감사드립니다. 나는 회신을 upvoted했습니다.

다른 사람들을 참조하기 위해 필자는 쓰기 기능을 기다리고 Dapper 비동기를 변경했습니다.

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

그런 다음 결과를 모니터링하는 호출자에게 새로운 작업을 생성했습니다.

이것은로드 하에서 일관되게 작동하며 지나치게 새로운 연결이 생성되는 것을 보지 않습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow