2017-02-08 2 views
0

엔티티 프레임 워크 코어 및 mysql 커넥터가있는 내 dotnet 코어 프로젝트에 성능 문제가 있습니다. 1 요청 모두가 몇 요청 후엔티티 프레임 워크 연결 및 쿼리 증가

작업처럼 보인다 후

public async Task<Vehicle[]> GetAllVehicles() 
    { 
     _logger.LogInformation("Getting All vehicles"); 
     using (var dbContext = MhdContextFactory.Create(_dbConfig.ConnectionString)) 
     { 
      var vehicles = await dbContext.Vehicles.AsNoTracking() 
       .FromSql("SELECT * FROM Vehicles AS v group by v.VehicleId order by LastUpdate") 
       .ToArrayAsync(); 
      return vehicles; 
     } 
    } 

:이 메소드를 호출 내 컨트롤러에 http://insidemysql.com/howto-starting-with-mysql-ef-core-provider-and-connectornet-7-0-4/

public class MhdContext : DbContext 
    { 
     public MhdContext(DbContextOptions<MhdContext> options) : base(options) { } 

     public DbSet<Vehicle> Vehicles { get; set; } 
    } 

    public static class MhdContextFactory 
    { 
     public static MhdContext Create(string connectionString) 
     { 
      var optionsBuilder = new DbContextOptionsBuilder<MhdContext>(); 
      optionsBuilder.UseMySQL(connectionString); 

      //Ensure database creation 
      var context = new MhdContext(optionsBuilder.Options); 
      context.Database.EnsureCreated(); 
      var serviceProvider = context.GetInfrastructure<IServiceProvider>(); 
      var loggerFactory = serviceProvider.GetService<ILoggerFactory>(); 
      loggerFactory.AddProvider(new MyLoggerProvider()); 

      return context; 
     } 
    } 

:

나는 다음 튜토리얼에 의해 dbcontext 생성 중복 SQL 명령이며 증가 중 일곱 번째 요청 로그 : https://www.dropbox.com/s/2ezyowyubq1orsn/7thRequest.txt?dl=0

내가 잘못하고있는 것을 도와 줄 수 있습니까?

답변

0

Context를 반환하는 정적 팩토리를 만들지는 않습니다. Entity Framework (EF)의 '컨텍스트'는 데이터베이스를 여는 곳입니다. 서로 다른 쿼리에 대해 동일한 연결을 재사용 할 때 문제가 발생할 수 있습니다. 일반적으로 static은 Public Static Add (int x, int y) {Return x + y}와 같은 핵심 비즈니스 사용에 적합합니다. 그러나 데이터 액세스와 같은 것들을 위해서 나는 그들을 피하고 인스턴스 기반으로 선호합니다. 어쩌면 내가 틀렸고 선임 EF 전문가가 와서 그것을 설명 할 것입니다. 모든 것이 거기에 포함된다 그러나 일반적으로 나는 항상 같은 트랜잭션 범위를 포장하여 내 상황에 맞는 처분 : 내 경력에서

(var context = new EFContext()) // NOT BASED ON FROM A STATIC FACTORY 
{ 
    //Do some DB operation 
} 

을 전문적으로 EF를 사용하는 기업에서. 그들이 IOC를 사용하여 정적 또는 EF 인스턴스를 공유하려고 시도하면 시간이 지남에 따라 혼란스러워집니다. 당신이 막 열기, 연결하기, 뭔가를하는 것, 그것을 버리면 ('{}'을 사용하여 자동으로 처리되는) ​​그것을 닫으면 더 잘 동작합니다. 내 컨트롤러에서

public MhdContext(DbContextOptions<MhdContext> options) : base(options {} 

내가 depencency 주입하여 인스턴스를 얻을 :

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddDbContext<MhdContext>(
      options => options.UseMySQL(
       Configuration.GetConnectionString("MysqlConnection"))); 
    } 

그래서 내 DB를 contexte 지금과 같이 다음과 같습니다

0

나는 마침내 내 startup.cs에 추가로 이것을 해결 :

var dbContext = _serviceProvider.GetService<MhdContext>(); 
    return dbContext.Vehicles;