2009-08-23 4 views
2

ASP.NET 웹 서비스에서 정적 메서드를 호출 할 때 함정이 있는지 알고 싶습니다.ASMX에서 정적 메서드를 호출 할 때의 주의점

internal static object SelectScalar(String commandText, DataBaseEnum dataBase) 
    { 
     SqlConnection sqlc = new SqlConnection(AuthDbConnection.GetDatabaseConnectionString()); 
     object returnval=null; 
     if (sqlc!=null) 
     { 
      SqlCommand sqlcmd = sqlc.CreateCommand(); 
      sqlcmd.CommandText = commandText; 
      sqlc.Open(); 
      returnval = sqlcmd.ExecuteScalar(); 
     } 
     return returnval; 
    } 

위의 방법 예를 들어, 여러 웹 메소드와이 메소드를 동시에 호출하는 여러 클라이언트 (예 :이 함수를 호출하는 웹 메소드에 대한 1000 건의 호출)에 함정이 있습니까?

답변

3

SqlConnection을 작성 했으므로 폐기하거나 연결을 닫지 않을 것입니다. 사용 지침은 MSDN을 참조하십시오.

정적 인 방법이지만 ... 공유 상태 (전역 변수)를 업데이트하지 않으므로 문제가되지 않는 것 같습니다.

EDIT : AFAIK, 웹 서비스의 정적 메소드의 '함정'은 다른 애플리케이션과 동일합니다. 주의해야 할 점은 웹 서비스는 오랜 시간 동안 안정적으로 작동 할 것으로 예상되는 서버라는 것입니다. 따라서 시간이 지남에 따라 문제 (메모리 누수, DB 연결 고갈 등)를 일으킬 수있는 사항은 훨씬 짧은 기간 동안 실행되는 다른 응용 프로그램보다 중요합니다.

+0

예 ... 스레드 안전성 외에도 코드의 다른 측면을 살펴 보았습니다. +1. –

+0

방금이 작은 발췌 문장을 편집했습니다. 우리는 연결을 끊습니다. – choudeshell

3

정적 멤버가 응용 프로그램 도메인의 다른 스레드에서 액세스 할 수있는 상태를 변경할 때주의해야 할 점이 있습니다. 이러한 경우 올바른 방법으로 올바른 조치를 취해야합니다.

당신의 방법은 그 자체로 상태를 벗어나지 않습니다 (모든 것이 지역적입니다). 그래서 괜찮습니다.

duffymo으로

및 네이더는는 IDisposable을 구현하는 모든 객체의 dipose해야 당신이 연결 폐기해야 지적했다.

3

C#이 Java와 비슷하지만 SQL 연결을 열고 메서드를 종료하기 전에 닫지 못하는 것은 나에게 좋은 생각처럼 보일 수 없습니다. GC가 범위를 벗어나면 GC가 정리되지만 Java에서 연결을 종료하는 것과 같은 것은 아닙니다.

Java의 관용구는 finally 블록에서 연결을 닫을 것을 요구합니다. C# 클래스가 그런 것을 필요로하지 않는 한 확신하지 않는다면, 나는 그것을 조사 할 것이다.

곧 발견 될 것입니다. 수천 건의 웹 호출로 인해 부족한 경우 신속하게 사용할 수있는 연결 수가 줄어들 것입니다.

확인할 사항 : Java에서 비용이 많이 드는 연결 방식이므로 일반적으로 풀링됩니다. 연결 풀링도 C#에서 수행됩니까? 데이터베이스 연결을 열고 닫는 것이 비효율적입니까? 고정 된 공유 연결로 동일한 작업을 수행 할 수 있습니까? 그렇게하면 스레딩 문제가 발생할 수 있습니다.

+0

연결에서 dispose를 호출해야한다는 내용을 작성했습니다. +1. –

+0

@duffymo : 예, 풀링을 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx –

+0

죄송합니다. 방금 작은 스 니펫을 복사하고 편집했습니다. 예 - 연결을 끊고 연결 풀링을 사용합니다. 나는 어떤 함정이 있는지 알기 만했다. 어떤 종류의 함정인지 전혀 모르겠다. 우리는 많은 장소에서 이러한 유형의 패러다임을 사용합니다. – choudeshell