2009-03-12 2 views
6

내가 follwing을 방법 contanins 데이터베이스 클래스가 있습니다C# 정적 데이터베이스 클래스?

  • 공공 부울 ExecuteUDIQuery (문자열 쿼리를) // UDI = 업데이트 (삽입
  • 공공 부울 ExecuteSelectQuery (문자열 쿼리)
  • 공공 부울 ExecuteSP 삭제 방법의

결과에 저장된 문자열 SP 문자열 [] PARMS)

  • 공개 INT ExecuteSPReturnValue (SP 문자열, 문자열 [] PARMS) 개인 데이터 세트 또는 데이터 테이블. 이러한 객체는 getter로 정의됩니다.

    Database 클래스를 사용하는 약 10 개의 클래스가 있습니다. 모든 클래스는 Database 클래스의 객체를 만듭니다. 이제는 Database 클래스를 정적으로 만들려고합니다. 이것은 좋은 생각입니까? 그렇다면 왜? 그렇지 않은 이유는 무엇입니까?

  • 답변

    5

    내가 이해한다면 데이터베이스 클래스에는 쿼리 결과를 저장하는 몇 가지 속성이 있습니까? 그렇다면 스레드로부터 안전하지 않으므로 정적으로 만들 수 없습니다. 쿼리의 결과가 이러한 속성에 저장되어있는 경우 두 번째 쿼리가 첫 번째 쿼리 바로 다음에 실행되면 어떻게됩니까? 동일한 정적 변수에 저장됩니다. 웹 응용 프로그램에서도 마찬가지입니다. 다른 사용자가 사이트를 탐색 한 결과 첫 번째 사용자의 결과가 변경됩니다.

    편집 요약 : 정적 변수에 쿼리 결과를 저장할 때 클래스를 정적으로 만들지 마십시오. 특히 웹 사이트에서 클래스를 사용할 때가 아닙니다. 속성 값이 모든 방문자 사이에 공유되므로 웹 사이트. 20 명의 방문자가 동시에 쿼리를 수행하면 방문자 1은 방문자 20의 쿼리 결과를 볼 수 있습니다.

    +0

    나는 웹 사이트를 만들고있다. 그래서 내가 올바르게 이해한다면, 20 명의 방문자가 모두 다른 페이지를 요청할 때 (그리고 제 db 클래스가 정적 인 경우) 그것은 잘못되었습니다. 맞습니까? – Martijn

    +0

    예, 올바르게 이해하고 있습니다. 클래스가 정적 인 경우 속성은 응용 프로그램간에 공유됩니다. 따라서 20 명의 방문자가 데이터베이스 쿼리를 수행하면 마지막 쿼리 결과가 방문자 번호 20에 의해 실행됩니다. – Razzie

    0

    DB에 대해 쿼리를 실행하는 중일 때는 정적으로 설정하십시오. 이 객체가 일종의 상태를 유지해야하는 경우에만 인스턴스를 만들어야합니다.

    0

    정적 메서드가있는 경우 데이터베이스를 열고 닫을 때 인스턴스를 추적해야합니다.

    아마도 인스턴스 또는 현재 인스턴스라고하는 정적 메서드가 필요합니다. 그리고 당신은 db 클래스의 새로운 인스턴스를 생성하여 정적 메소드로 반환합니다.

    +0

    유지 "인스턴스"에 소스 코드를 확인할 수 있습니다. DB ASAP에 대한 연결을 닫아야합니다. – Inferis

    +0

    물론 연결을 끊어야합니다. 그러나 명령에 액세스하기위한 정적 클래스가 있으면 데이터 연결을 관리 할 수 ​​있습니다. 끝나면 독자를 닫기위한 명령이 있습니다. –

    4

    특정 예제에서는 클래스를 정적으로 만들지 말 것을 권한다. 데이터베이스 클래스에서 상태를 유지하고 클래스를 정적으로 만들면 해당 상태가 데이터베이스를 사용하는 모든 클래스간에 공유됩니다. 현재 설정에서 각 데이터베이스 인스턴스는 자체 상태를 유지하므로 데이터베이스 호출이 서로 방해하지는 않습니다.

    메서드 호출시 데이터 집합을 반환하도록 Database 클래스를 리팩터링하는 경우 데이터베이스 인스턴스에 정적 인 정보가 남아 있지 않아야합니다.

    하지만 그렇지 않은 경우가 있습니다. 아니요, 클래스를 정적으로 설정하지 마십시오.

    +2

    나는 Inferis에 동의합니다. 데이터베이스 클래스에 쉽게 액세스 할 수있는 facade 클래스를 만들 수도 있습니다. – Statement

    1

    사용하는 데이터베이스 또는 ORM 종류에 따라 다릅니다. 그러나 내 경험상 좋은 생각 인 것 같았지만 결국 나를 축축하게 만들었다. 다음은 LINQ-to-SQL에서 저의 방식입니다 :

    데이터 컨텍스트에 정적 변수가있는 저장소 클래스가 있습니다. 처음에는 효과가 있었지만 더 많은 저장소 클래스를 만들어야 할 때 해킹에 따라 버그가 발생했습니다. LINQ-to-SQL의 데이터 컨텍스트가 모든 결과를 캐시하고이를 새로 고칠 방법이 없다는 것이 밝혀졌습니다.따라서 하나의 컨텍스트에서 테이블에 게시물을 추가하면 해당 테이블을 캐시 한 다른 게시물에는 나타나지 않습니다. 해결 방법은 정적 수정자를 제거하고 저장소가 생성자에서 컨텍스트를 만들도록하는 것이 었습니다. 저장소 클래스는 사용 된대로 생성되었으므로 새롭고 새로운 데이터 컨텍스트가됩니다.

    정적 변수는 메모리에 차지하는 공간이 적지 만 데이터 컨텍스트의 크기는 아주 작으며 결국에는 가비지 수집됩니다.

    2

    스레드 안전성에 대한 다른 의견 이외에도 평행 화 문제도 있습니다. 귀하의 경우 데이터베이스에 동시에 여러 연결을 열 수 없으며 결과의 스레드 안전성이 문제가되지 않더라도 다중 병렬 쿼리를 수행 할 수 없습니다.

    그래서 나는 다른 것들에 동의합니다. 정적 클래스를 만들지 마십시오.

    클래스를 정적으로 만드는 것이 편리 할 수 ​​있지만 새로운 인스턴스를 만드는 것은 비용이 많이 드는 작업이 아니므로 성능 측면에서 많은 이점을 얻을 수는 없습니다.

    편집 :
    웹 사이트에서 수업을 사용하고 싶다는 의견을 보았습니다. 이 경우 정말로 이것을해서는 안됩니다. 정적 데이터베이스 클래스를 사용하면 언제든지 한 요청을 안전하게 처리 할 수 ​​있으며 원하는 것은 아닙니다.

    0

    귀하의 정적 사용법에 좋은 방법입니다. 내 생각에, 당신은 이제 그들을 정적 방법으로 변환하는 데 문제가 없습니다.

    하지만 나중에 거래를 관리해야 할 수 있습니다. 트랜잭션 관리를 클래스에 맡기면 많은 시간을 절약 할 수 있다고 생각합니다. 이 시나리오는 비 정적 클래스에 가장 적합합니다.

    1

    답변 게시물과 반대입니다. 정적 인 데이터베이스 액세스로 웹 프레임 워크를 구축했으며 뛰어난 성능을 제공합니다.

    당신은 개방이 좋은 생각이 아니다 http://www.codeplex.com/Cubes