2010-01-05 2 views
2

응용 프로그램 시작시 데이터베이스 연결의 인스턴스를 캐시해도됩니까? 스레드 안전에 MSDN documentation 보면정적 캐싱 DatabaseFactory.CreateDatabase를 사용할 수 있습니까?

, 내가 인용 :

모든 공용 static [...] 이러한 유형의 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버가 스레드로부터 안전하다는 보장은 없습니다. 이 허용하는 경우

public static class BookingMapper 
{ 
    public static Database Db { get; set; } 

    static BookingMapper() 
    { 
    Db = DatabaseFactory.CreateDatabase(); 
    } 

    public static string GetBooking(int id) 
    { 
    using (DbCommand cmd = Db.GetStoredProcCommand("getBooking")) 
    { 
     Db.AddInParameter(cmd, "@Id", DbType.Int32, id); 
     using (IDataReader dr = Db.ExecuteReader(cmd)) 
     { 
     ... 
     } 
    } 
    } 
} 

가, 혜택/단순히 데이터베이스 인스턴스를 통해 이러한 방식을 사용하는 단점이 무엇인가 : 같은 아래 예제대로/허용 코드에 대한 안전하다는 것을 감안할 때

모든 단일 메소드 호출에서?

미리 감사드립니다.

업데이트 :

더 많은 연구가 Putting the Database Factory to Use 섹션에서이 허용 제안하는 PrimaryObjects.com article에 저를 지적했다. 그러나 나는 이런 식으로하는 것이 장단점이 있는지 궁금해하고있다.

Similar question

답변

3

1)이 MSDN에서 스레드로부터의 안전성에 그 표준 문구를 해석하는 방법은 두 가지가 있으며, 그들은 그것을 명확히 거라고 나는 바랍니다. 당신의 해석은 좋을 것이지만 그것이 의미하는 바는 다음과 같을 것이라고 생각합니다 :

이 유형의 일부이고 public 및 static 인 멤버 (메소드, 필드, 속성 등)는 스레드로부터 안전합니다

(예 subphrase "이러한 유형의 멤버"해석하는 방법은 두 가지가 있습니다)

2) 일반적으로, 당신은 주위에 DB 연결을 공유하고 싶지 않아요 - 당신이 연결을 열려는, 당신의 일을하고 그것을 닫으십시오. 일반적으로 단일 연결과 연관된 여러 개의 열린 독자를 가질 수는 없습니다 (이것은 ent 라이브러리 특정이 아닌 일반적인 db/연결 조언입니다).

3) Ent 라이브러리 내부의 추가 읽기에서 CreateDatabase 호출에 의해 반환 된 Database 객체는 연결 자체가 아니며 연결 관리가 2 번에서 설명한대로 처리 된 것처럼 보입니다. 데이터베이스 개체 자체를 안전하게 공유 할 수 있습니다.

+0

@ damien, 나는이 주제에 대해 좀 더 조사해 보았고 편집에 언급 된대로 http://www.primaryobjects.com/CMS/Article81.aspx로 안내했습니다. 이런 식으로해도 괜찮은 것 같지만 찬반 양론에 대한 분석은없는 것 같습니다. –

+0

포인트 3으로 판단하면 인스턴스 자체를 만드는 데 절약 효과가 많이 없음은 아닙니다. –

+0

나는 ent lib를 설치 한 후에 "src"디렉토리에서 설치할 수있는 소스를보고 나서 포인트 3을 만들었습니다. 그러면 다양한 기능 안에서 얼마나 많은 작업이 수행되는지 확인할 수 있습니다. (또는 소스를 설치하지 않으려는 경우 반사경을 통해 비슷한 정보를 얻을 수 있습니다) –