2011-02-13 2 views
0

나는 SqlConnection을 사용하는 많은 메소드를 가진 웹 서비스를 만들고 있습니다. 클래스 레벨 연결을 선언하고 웹 서비스 생성자에서 초기화하는 것이 논리적 인 것처럼 보입니다.asp.net webservice OnUnload?

문제 웹 서비스 호출이 완료 될 때 연결을 해제 할 수있는 확실한 방법을 찾을 수 없어 연결이 누출됩니다. Dipose() 메서드를 재정의하려고 시도했지만 합리적인 시간대에 호출되지는 않습니다 (실제로 테스트하지는 않습니다). 좋은 측정을 위해 Disposed() 이벤트에 핸들러를 연결하려고했지만 같은 문제가 예상됩니다.

웹 서비스 클래스의 Page.OnUnload와 비슷한 점이 있습니까? 모든 개별적인 방법에서 별도의 연결을 설정해야한다고 믿는 것이 어렵습니다.

제안 사항?

답변

3

클래스 수준 연결을 선언하고 웹 서비스 생성자에서 초기화하는 것이 논리적 인 것처럼 보입니다.

아니요, 논리적으로 보이지 않습니다. ADO.NET에서는 connection pooling을 사용하므로이 작업을 수행 할 필요가 없습니다. 이 연결 풀은 응용 프로그램 도메인 당 연결 문자열 당입니다.

그래서 당신은 단순히 각 웹 방식의 풀에서 새 연결을 그리고 마지막에 풀에 반환 할 수합니다 (using 문이 처리됩니다) :

[WebMethod] 
public void Foo() 
{ 
    // Here you are NOT creating a new connection to the database 
    // you are just drawing one from the connection pool 
    using (var conn = new SqlConnection(SomeConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     // Here you are NOT opening a new connection to the database 
     conn.Open(); 
     cmd.CommandText = "SELECT id FROM foo"; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       // do something with the results 
      } 
     } 
    } // Here you are NOT closing the connection, you are just returning it to the pool 
} 

을 그래서 여기에 조언이야 : 일부 클래스 필드, 정적 필드를 사용하여 수동으로 연결을 관리하지 마십시오.이 관리를 ADO.NET에 맡기는 것이 좋습니다.

참고 : 표시된 코드는 일반적으로 웹 메서드에서 호출하는 데이터 액세스 레이어에 있습니다.

+0

대린 감사합니다. 그러나 이것은 실제로 피하려고 시도한 것입니다. 즉, {} 블록을 사용하여 각 메소드를 꾸미는 중입니다. 연결 풀링의 작동 방식을 이해합니다. 웹 서비스 클래스의 코드 오버 헤드가 줄어 듭니다. 모든 메소드에서 연결 객체를 사용할 필요가 있기 때문에 선언을 클래스 레벨에서 한 곳으로두고 생성자/소멸자 (논리적으로 의미 한 것)를 사용하기를 원했습니다. 당신이 묘사 한 것은 제가 현재 사용하고있는 것입니다. 나는 내가 추측하는 깔끔한 방법을 기대하고있었습니다. – aaaaaaaaaaaaaaa1111111

+0

나는 정교해야한다 - 웹 서비스 클래스가 각 메서드 호출과 각 스레드에 대해 한 번 인스턴스화된다고 가정했다. 내가 성취하려고 노력하는 것은 사실 인 것에 달려 있습니다. 그것이 사실이 아니라면 당신의 모범이 유일한 길입니다. – aaaaaaaaaaaaaaa1111111