2012-04-10 3 views
0

거의 30 분 동안 실행되는 쿼리에서 데이터를 검색하고 웹 페이지로 가져와야하는 경우가 있습니다. (최대 최적화가 수행되었으므로이 시간을 줄이는 방법이 없습니다.) 응용 프로그램에 Entity Framework (EF, 데이터 액세스 레이어, Biz 로직 레이어, UI)와 함께 4 레이어 아키텍처를 사용합니다. DAL에 대한 인스턴스를 만들 때이 인스턴스를 다시 사용할 수있게되므로 추가 인스턴스를 만들 수 없으므로 싱글 톤 메서드를 사용하려고합니다 (데이터베이스에서 데이터를 검색하는 DAL). 동일 세션 내의 . 세션 상태를 설정하고 State Server에서 인스턴스의 가용성을 확인하려면 어떻게해야합니까?세션 상태 변수 및 싱글 톤 클래스

public static Singleton getInstance() { 
    if (**instance == null**) 
     instance = new Singleton(); 
    return instance; 
    } 

블록 if에는 무엇이 있어야합니까? if 블록에서 어떤 조건을 점검해야합니까? 나는 내가해야 할 일에 대해 정말로 확신하지 못한다.

추신 :이 세션의 시간 제한은 5 분이어야합니다. 이 내용은 Web.config 파일에서 지정할 수 있습니다. 그것은 사실입니까?

+0

세션은 이름 값 컬렉션입니다. DAL 인스턴스를 이름으로 가져온 다음 값이 null인지 확인하십시오. 그것이 널이 아닌 경우, DAL의 인스턴스로 변환하십시오. 가치가있는 부분에 대해서는이 패턴을 따르지 않을 것입니다. 각 요청에 대해 인스턴스를 만들고 처리하지 않으려는 DAL 작성에 대해 비용이 많이 드는 것은 무엇입니까? – Maess

+0

DAL의 개체가 생성 될 때마다 DB 및 따라서 복잡한 쿼리를 포함하는 저장 프로 시저에 액세스하게되고 데이터가 나올 때까지 1 분 정도 걸립니다. 인스턴트 메신저 인스턴스를 저장하고 빠른 액세스를 위해 두 번째 다시 사용을 생각하고 있어요. – krishgopinath

+3

각 사용자 세션에 대해 별도의 DAL을 만들고 있습니까? 왜 DAL은 세션에 특정한 것입니까? DAL에 대한 정적 속성을 가진 팩토리를 가질 수 없습니까? 속성이 호출되면 DAL 인스턴스의 팩토리의 정적 멤버가'null'인지 확인하십시오.존재하는 경우 인스턴스화하고 리턴하십시오. 그렇지 않다면 반환하십시오. – David

답변

1

오히려 Entity Framework 컨텍스트를 사용하고 데이터베이스에 액세스해야 할 때마다 (즉, 각 메서드에서) 생성해야합니다. 그것은 그런 식으로 사용되도록 최적화되어 있습니다. 연결 풀링은 매번 EF 컨텍스트를 재 작성하는 데 페널티가 없는지 확인합니다. 이것이 최선의 방법입니다.

그러나 DAL은 단순한 DB 액세스 이상일 수 있습니다. 각 세션에 대해 별도의 싱글 톤으로 사용하려면 첫 번째 요청에서 인스턴스를 만들어 세션에 저장하고 사용하기 전에 세션에 있는지 확인해야합니다. 스레드 안전성을 통해 코드는 다음과 같이 보일 수 있습니다.

class DALClass 
{ 
    private static object instanceLock = new object(); 

    public static DALClass Instance 
    { 
     get 
     { 
      if (Session["DALInstance"] == null) 
      { 
       lock (instanceLock) 
       { 
        if (Session["DALInstance"] == null) 
        { 
         Session["DALInstance"] = new DALClass(); 
        } 
       } 
      } 

      return (DALClass)Session["DALInstance"]; 
     } 
    } 
} 
+0

나는 DAL 객체가 싱글 톤이거나 세션에서 캐시되어야한다고 생각하지 않는다. 작업 결과를 캐시하지만 결과는 캐시하지 않습니다. 기껏해야 DAL은 DI에 의해 처리되어야하고 웹 요청 당 한 번만 작성해야합니다. 문서를 보려면 http://stw.castleproject.org/Default.aspx?Page=LifeStyles&NS=Windsor&AspxAutoDetectCookieSupport=1 –

+0

내가 지적했듯이 답변, 세션에서 DAL을 갖는 것이 최선의 방법은 아닙니다. 그 이상이 없다면 우리는 모른다. –

+0

@Maciej : 세션의 엔티티에 컨텍스트를 넣습니다. 괜찮습니까? – krishgopinath

1

의존성 주입에 적합한 아키텍처가 잘 정의되어있는 것처럼 들립니다. DI를 사용하면 IOC 컨테이너가 싱글 톤 객체 또는 일시적인 객체를 반환 할 수 있습니다. 그러나 웹 환경에서 싱글 톤을 사용하면 매우 중요하므로 종종 문제가 발생하기 때문에 조심하십시오.

실행중인 쿼리에 사용자 특정 데이터가 포함 된 경우 MVC와 같은 패턴을 사용하는 경우 응용 프로그램의 UI 부분을 구성하는 코드 내에서 해당 쿼리의 결과를 세션에 배치해야합니다. 컨트롤러 또는 MVP를 선택합니다.

이러한 패턴을 사용하지 않으면 세션을 마무리하고 해당 종속성을 비즈니스 개체에 삽입하는 경우에만 비즈니스 계층 내부에서 세션에 정보를 배치하는 것이 좋습니다. "IUserSession"과 같은 것입니다. 비즈니스 프로젝트에는 "system.Web"또는 이와 유사한 내용이 포함되어서는 안됩니다.

+0

여기서 중요한 점은 쿼리 결과 (DAL 아님)가 세션에 들어가야한다는 것입니다. Session 객체 자체는 이미 원하는 모든 특성을 가지고 있습니다. '동일한 세션 내에서 추가 인스턴스를 만들 수 없습니다.' (SQL 태그가 달린 질문에 검색어를 게시하는 경우 최적화에 도움이 될 수도 있습니다. 사용자가 선택의 여지가 있지만 사용하지 않는 한 30 초가 지나면 웹 페이지가 길어집니다.) – mafue