ADO.NET, Dapper QueryAsync 및 Glimpse.ADO의 조합에 관한 몇 가지 질문

ado.net asp.net dapper glimpse

문제

나는 비즈니스 로직을 처리하기위한 가벼운 솔루션을 실험 해왔다. Dapper 로 확장되고 Glimpse.ADO가 모니터링하는 바닐라 ADO.NET 연결로 구성됩니다. 이 설정의 사용 사례는 요청 당 비동기 적으로 소수의 쿼리를 처리해야하는 웹 응용 프로그램입니다. 아래 MVC 컨트롤러에서 내 설정의 간단한 구현.

public class CatsAndDogsController : Controller
{
    public async Task<ActionResult> Index()
    {
        var fetchCatsTask = FetchCats(42);
        var fetchDogsTask = FetchDogs(true);
        await Task.WhenAll(fetchCatsTask, fetchDogsTask);
        ViewBag.Cats = fetchCatsTask.Result;
        ViewBag.Dogs = fetchDogsTask.Result;
        return View();
    }

    public async Task<IEnumerable<Cat>> FetchCats(int breedId)
    {
        IEnumerable<Cat> result = null;
        using (var connection = CreateAdoConnection())
        {
            await connection.OpenAsync();
            result = await connection.QueryAsync<Cat>("SELECT * FROM Cat WHERE BreedId = @bid;", new { bid = breedId });
            connection.Close();
        }
        return result;
    }

    public async Task<IEnumerable<Dog>> FetchDogs(bool isMale)
    {
        IEnumerable<Dog> result = null;
        using (var connection = CreateAdoConnection())
        {
            await connection.OpenAsync();
            result = await connection.QueryAsync<Dog>("SELECT * FROM Dog WHERE IsMale = @im;", new { im = isMale });
            connection.Close();
        }
        return result;
    }

    public System.Data.Common.DbConnection CreateAdoConnection()
    {
        var sqlClientProviderFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
        var dbConnection = sqlClientProviderFactory.CreateConnection();
        dbConnection.ConnectionString = "SomeConnectionStringToAwesomeData";
        return dbConnection;
    }
}

CreateAdoConnection() 메서드에서 연결 만들기와 관련하여 몇 가지 질문이 있습니다. 나는 뒤에서 다음과 같은 일이 일어나고 있다고 가정한다.

를 호출 sqlClientProviderFactory.CreateConnection() 의 인스턴스를 반환 System.Data.SqlClient.SqlConnection A와 통과 System.Data.Common.DbConnection . 이 시점에서 Glimpse.ADO.AlternateType.GlimpseDbProviderFactoryGlimpse.Ado.AlternateType.GlimpseDbConnection 의 인스턴스에서이 연결을 시작하고이 연결을 래핑합니다.이 연결은 또한 System.Data.Common.DbConnection 전달됩니다. 마지막으로,이 연결은 QueryAsync<>() 를 가져 오는 데 사용되는 QueryAsync<>() 메서드 중 쿼리 메서드를 사용하여 Dapper 라이브러리에 의해 간접적으로 확장됩니다.

질문 :

  1. 위의 가정이 맞습니까?
  2. 이 연결에서 Dapper의 비동기 메서드를 사용하거나이 연결의 CreateCommand() 메서드를 사용하여 System.Data.Common.DbCommand 를 만들고 비동기 메서드를 사용하는 경우 이러한 호출은 내부적으로 항상 이러한 메서드의 바닐라 비동기 구현을 사용합니다. Microsoft는 System.Data.SqlClient.SqlConnectionSystem.Data.SqlClient.SqlCommand 대해 이들을 작성했습니다. 그리고 실제로 블로킹하는 이러한 메소드의 다른 구현은 없습니까?
  3. System.Data.SqlClient.SqlConnection 직접 반환하는 것과 비교하면 얼마나 많은 perf가이 설치에서 손실됩니까? (Glimpse.ADO wrapper없이)
  4. 이 설정을 개선하기위한 제안 사항이 있습니까?

수락 된 답변

  1. 예. GlimpseDbProviderFactory 는 등록 된 모든 팩토리를 랩핑 / 장식 / 프록시합니다. 그런 다음 전달하는 모든 호출을 랩핑하는 팩토리 (이 경우 SQL Server)로 전달합니다. CreateConnection() 의 경우에는 우리가 가지고있는 내부 팩토리에 연결을 생성 할 것을 요청하고, 연결을 얻으면이를 래핑 한 다음 원래 호출자에게 반환합니다.
  2. 예. Glimpse 비동기 요청을 차단 요청으로 전환 하지 않습니다 . 우리는 비동기 체인을 항상 인내합니다. 관심이 있다면 문제의 코드가 여기에 있습니다 .
  3. 아주 작은. 본질적으로 이와 같은 데코레이터 패턴을 사용하면 하나 또는 두 개의 프레임 만 호출 스택에 추가됩니다. 요청 수명주기 동안 수행되는 대부분의 작업과 비교할 때 여기서 일어나는 일을 관찰하는 시간은 극히 미미합니다.
  4. 네가 가진 것은 멋지다. 단지 공장을 짓는 코드에 대한 제안 만있을뿐입니다. 이 코드는 연결 문자열 등을 web.config로 옮길 수 있음을 의미합니다.


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