2016-09-26 11 views
1

동일한 DbCommand를 다시 사용하고 동일한 요청에서 DB에 액세스해야 할 때마다 새 연결을 설치하지 않으려면 DbCommand를 저장하고 반환하는 메서드를 만들었습니다 그것은 그 이전에 인스턴스화 된 경우 : 나는 그것을 사용하여 URL에 2 개 개의 동시 요청을 할 때ASP.Net 코어 Npgsql 작업이 이미 진행 중입니다.

var dbCommand = InformacionInscripcionesViewModel.GetDbCommand(); 
dbCommand.CommandText = @"SELECT sga_propuestas.nombre_abreviado AS nombre_carrera, ...."; 
dbCommand.ExecuteNonQuery(); 

, 그것은으로 dbCommand.ExecuteNonQuery();에서 예외가 발생합니다 : 그것은이 모델에 사용되는 방법의

public static class InformacionInscripcionesViewModel { 

     private static NpgsqlConnection _dbConnection; 
     private static NpgsqlCommand _dbCommand; 

     private static NpgsqlCommand GetDbCommand() { 
      InformacionInscripcionesViewModel._dbConnection = InformacionInscripcionesViewModel._dbConnection ?? new NpgsqlConnection("Host=192.168.1.127;Username=siu;Password=123456;Database=guaraniprueba20160816"); 
      if (InformacionInscripcionesViewModel._dbConnection.State == ConnectionState.Closed) 
       InformacionInscripcionesViewModel._dbConnection.Open(); 

      return InformacionInscripcionesViewModel._dbCommand 
        ?? (InformacionInscripcionesViewModel._dbCommand = new NpgsqlCommand {Connection = InformacionInscripcionesViewModel._dbConnection}); 
     } 
} 

예 메시지 An operation is already in progress .

이 문제를 방지하려면 어떻게해야합니까? 사용하기 전에 항상 DbCommand을 순간 실행해야합니까? 이것에 대한 어떤 불빛이라도?

{System.InvalidOperationException: An operation is already in progress. 
    at Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState) 
    at Npgsql.NpgsqlCommand.ExecuteNonQueryInternal() 
    at Npgsql.NpgsqlCommand.ExecuteNonQuery() 
    at SIUNPAZ.Models.InformacionInscripcionesViewModels.InformacionInscripcionesViewModel.GetTotalesInscripcionesPorMaterias(DateTime fechaDesde, DateTime fechaHasta, String carrera) 
    at SIUNPAZ.Controllers.InformacionInscripcionesController.PorMaterias(DateTime fechaDesde, DateTime fechaHasta, String carrera) 
    at lambda_method(Closure , Object , Object[]) 
    at Microsoft.AspNetCore.Mvc.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionFilterAsync>d__28.MoveNext()} 

답변

3

... 그리고이 같은 요청에 대부분의 다른 ADO.NET 구현처럼

의 DB에 액세스해야 할 때마다 새로운 연결을 instatiating하지 Npgsql 연결 풀링, 너무 오래있다 Dispose() 동시 연결이 없으면 기본 연결이 다시 사용됩니다. Ad-hoc 연결 풀링에서 버그를 수정하지 마십시오. 이미 제공된 것을 사용하십시오.

+0

그래서 NpgsqlConnection 또는 NpgsqlCommand를 처리해야합니까? – JorgeeFG

+1

확실히 연결을 처리하십시오. 명령의 연결 속성을 설정 해제하고 와드 다음에 다시 설정할 수는 있지만 명령을 많이 저장하지는 않습니다 (자체 명령은 "light"입니다). 그래서 실제로 두 명령을 사용하여 '차단하고 자동으로 처리하도록하십시오. –

2

요청을 가로 질러 DB 연결을 공유 할 수 없습니다. 단일 요청에서 여러 명령에 대해 단일 연결을 공유하는 것은 좋지만 수명은 요청 수명과 관련되어 있어야합니다. 시작으로 '정적'을 제거하면 코드가 실행됩니다. IoC 컨테이너 (Unity, Ninject, StructureMap 등)를보고 연결을 만들고 생성자에서 요청하면됩니다. 대부분의 클라이언트는 자동으로 개체를 HTTP 요청 범위로 지정할 수있는 수명 관리자를 보유하고 있습니다.

또한 일반적으로 ViewModels에 로직을 포함하는 것은 좋지 않은 것으로 간주됩니다. ViewModel에는 DbConnections가 없어야합니다. 데이터 액세스를위한 서비스를 만들거나 DB 코드를 컨트롤러로 옮겨야합니다.