2013-08-30 2 views
0

닷넷 MVC 4 웹 API 서비스 연결

우리는 닷넷 MVC 4 웹 API 서비스 계층을 가지고있는 설정, 즉이 SQL 서버에서 데이터를 가져 오는 웹 응용 프로그램을 통해 액세스 할

2008 데이터베이스

문제 5 개 이상의 GET 요청이 동시에 웹 서비스에 만들어지고있는

하는 500 Interal Server Error은 웹 응용 프로그램에 반환됩니다. .net 오류를 자세히 살펴보면 다음과 같이 표시됩니다.

오류가 발생했습니다.
연결이 닫히지 않았습니다. 연결의 현재 상태가 열려

예외가 발생되고있는 C# 서비스 코드 : 나는 열려 있고 난 단지에 시도하는 경우 수동으로 연결을 종료하는 것을 시도했다

public class ImageLinkRepository : IImageLinkRepository 
{ 
    private SqlConnection cnnSQL = new SqlConnection(...); 

    public IEnumerable<ImageLink> Get(String userId) 
     { 

      ImageLinks = new List<ImageLink>(); 

      // open connection to DB 
      cnnSQL.Open(); 

      try 
      { 
       SqlCommand cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL); 
       cmmSQL.CommandType = System.Data.CommandType.StoredProcedure; 

       SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter 
       { 
        ParameterName = "@LCIMGLINKUSERID", 
        Value = userId 
       }); 

       SqlDataReader rdrSQL = cmmSQL.ExecuteReader(); 

       if (rdrSQL.HasRows) 
       { 
        while (rdrSQL.Read()) 
        { 
         ImageLinks.Add(new ImageLink 
         { 
          // set new ImageLink object's properties  
          imageTopicId = DBReader.SQLString(rdrSQL, "LCIMGLINKIMGTOPICID"), 
          id = DBReader.SQLInt(rdrSQL, "LCIMGLINKPK"), 
          recordId = DBReader.SQLString(rdrSQL, "LCIMGLINKRECORDID"), 
          text = DBReader.SQLString(rdrSQL, "LCIMGLINKTEXT"), 
          topicId = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICID"), 
          topicItem = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICITEM"), 
          url = DBReader.SQLString(rdrSQL, "LCIMGLINKURL"), 
          user = DBReader.SQLString(rdrSQL, "LCIMGLINKUSERID") 
         }); 
        } 
       }  
      } 

      // close connection to DB 
      cnnSQL.Close(); 

      return ImageLinks; 
     } 
} 

연결이 닫혀 있거나 둘 다 작동하지 않으면 연결을 엽니 다.

서비스가 동시 요청을 처리 할 수 ​​있어야합니다. 내가 틀린 일을해야합니다. 내가 뭘 놓치고 있니?

답변

1

SQL 연결 풀이 고갈 될 가능성이 있습니다. 시작하려면 SqlCommand, SqlConnectionSqlReadersusing() 문으로 바꿔 올바르게 처리하고 닫아야합니다.

필드로 구성된 SqlConnection은 컨트롤러가 처분해야 할 책임이 있음을 의미합니다. 메서드 내에서 구성하는 것이 더 쉽습니다.이 메서드는 using()으로 래핑 될 수 있습니다. 그렇지 않으면 클래스가 IDisposable()을 구현하고 Connection에서 .Dispose()을 호출해야합니다.

try 
{ 
    using (var cnnSQL = new SqlConnection(...)) 
    { 
    using (var cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL)) 
    { 
     cmmSQL.CommandType = System.Data.CommandType.StoredProcedure; 

     SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter 
     { 
      ParameterName = "@LCIMGLINKUSERID", 
      Value = userId 
     }); 

     using (var rdrSQL = cmmSQL.ExecuteReader()) 
     { 
     ... 
     } 
    } 
    { 
} ... 
+0

'사용'블록을 추가하면 문제가 해결되었습니다. 일부 서비스 클래스는 여러 메서드가 정의되어 있으므로 각 메서드 외부에서 연결을 선언하고 동일한 'SQLConnection' 개체를 공유하는 것이 더 합리적 인 것처럼 보였습니다. 난 그냥'IDispoasable()'구현에 대해 몰랐어요. 연결을 닫은 후에'Dispose()'메서드 호출을 추가했지만 항상 500 오류를 웹 응용 프로그램에 반환합니다. 어쨌든, 고마워! – Zengineer

+0

닷넷의 SQL 커넥션 풀링 (SQL Connection Pooling)은 커넥션을 실제로 재사용 할 수있는 환경을 제공합니다. 처음부터 완전히 새로 생성하는 것처럼 보입니다. – STW