2009-03-03 2 views
4

에서 싱글 톤 패턴을 사용하는 단점 나는 싱글 톤 패턴 구현 DAL를 사용하도록 요청했지만, 내 생각의 어려운 내가 장단점을 알고 싶습니다장점과 DAL

을 transactions..etc 사용하여 연결을 풀링하는 또한 내가 개발하고있는 사이트에 대해 500 명 이상의 동시 사용자가있을 수 있으므로 연결을 풀링하는 가장 좋은 방법을 알고 싶습니다.

DB 서버는 Oracle 10g입니다.

DAL 내가 DAL에 대해 알고하지 않습니다하지만 싱글 패턴이 좋은 캡슐화를 유지하면서 데이터가 글로벌 만들 수있는 좋은 방법입니다 엔터프라이즈 라이브러리 3.1

답변

3

싱글 톤 패턴은 DAL에 매우 좋습니다. 저는 자체 엔터프라이즈 웹 응용 프로그램 (수백 명의 사용자와 20 개의 싱글 톤 클래스에서 2,000 가지 이상의 메서드)에서이 패턴을 사용합니다. 연결 풀링은 실제로 ado.net과 SQL Server 자체에서 가장 잘 처리됩니다. 여러 유형의 백엔드 서버를 원할 경우 문제가되지 않습니다. 싱글 톤 패턴이 있더라도 매개 변수, 텍스트/프로 시저 이름, 자격 증명/연결 문자열을 모두 전달한 상태에서 데이터베이스에 직접 호출하는 세부 사항을 처리하는 중앙 집중식 데이터 액세스 클래스가 필요할 수 있습니다.

제 경우에는 단일 데이터베이스의 각 프로 시저가 데이터베이스의 저장 프로 시저와 1 : 1에 해당합니다. 이것은 기본적으로 각 저장 프로 시저에 대한 C# "프런트 엔드"훅을 만들어서 구문 론적으로 말하면 네이티브 C# 코드와 거의 비슷하게 호출 할 수 있습니다. DAL에 대한 전화는 매우 간단합니다. 문제의 SP가 엄청나게 많아서 싱글 톤이 여러 개 있습니다. 각 SP에는 Development_ 또는 Financial_ 또는 Organization_ 또는 기타와 같은 접두사가 있습니다. 그런 다음 Development, Financial 또는 Organization과 같은 각각에 해당하는 싱글 톤 클래스를가집니다. 따라서 Sp_ Organization_ViewData는 C#에서 Organization이라는 이름의 싱글 톤 클래스에 대해 ViewData라는 메소드가됩니다.

물론 그 방법 중 하나 일 뿐이지 만 지난 6 년 동안 여러 개발자와 많은 양의 코드에서 잘 작동하는 것으로 나타났습니다. 중요한 점은 일관성이 중요하다는 것입니다. 프론트 엔드 프로그래머가 싱글 톤 중개자 중 한 곳에서 메소드의 이름을보고 있다면, 데이터베이스 끝 부분으로가는 곳을 정확하게 알려줘야합니다. 그렇게하면 문제가 있거나 누군가 코드를 검색하여 코드를 이해하려고하면 코드를 추적 할 필요가 줄어 듭니다.

0

를 사용합니다.

0

DAL의 데이터베이스 연결 팩토리에 싱글 톤을 사용하는 것이 일반적입니다. 이 도구를 사용하면 많은 코드를 변경하지 않고도 공장의 다양한 구현을보다 쉽게 ​​플러그인 할 수 있습니다. 많은 사람들이 싱글 톤 패턴을 좋아하지 않는 것 같지만,이 유형의 것은 괜찮습니다.

1

연결 풀링에 대한 최선의 방법은 직접 구현하지 않고 대신 ADO.NET 프레임 워크에서 처리하도록하는 것입니다.

연결 문자열의 매개 변수로 연결 풀링 옵션을 설정할 수 있습니다. 그런 다음 해당 문자열로 열린 모든 연결은 프레임 워크에서 구현되고 관리되는 연결 풀에서 제공됩니다. OracleConnection을 닫거나 처분하면 기본 연결은 삭제되지 않고 대신 풀로 돌아갑니다. 나는 데이터 액세스 레이어를 포장을 사용했습니다, 그리고 그것은 항상 잘 작동하고있다 : 일반적으로 싱글 톤의 사용에 대한 http://msdn.microsoft.com/en-us/library/ms254502.aspx

:

이 여기에 설명되어있다.

트랜잭션은 데이터베이스 전체가 아니라 특정 연결에만 적용됩니다. 즉, 여러 개의 스레드가 실행될 수 있으며 각 스레드가 별도의 OracleConnection 인스턴스를 사용하면 개별 스레드가 독립적 인 트랜잭션을 통해 데이터베이스를 읽고 쓸 수 있습니다.

+0

어떻게 싱글 톤 패턴으로 트랜잭션을 관리 했습니까 ?? – Novice

+0

나는 거래에 관해 이야기하기 위해 다른 단락을 추가했다. –

+0

그러나 응용 프로그램에서 단일 DAL 개체를 공유하는 경우 ADO.net의 연결 풀을 사용할 수있는 방법은 단일 DAL 개체가 언제든지 하나의 연결 만 필요하기 때문입니다. – Novice

0

싱글 톤을 사용하는 경우 성능 차이가 발생할 것이라고 생각하지 않습니다. 동일한 스레드에서 동시에 여러 스레드를 실행할 수 있기 때문입니다. 모든 스레드에서 공유 할 내부 필드가 없다면 모든 것이 잘 작동합니다.

결국 연결 풀을 관리하는 클래스는 스레드 안전성이 있어야하며 성능에 영향을 미칠 수있는 몇 가지 잠금을 만들지 만 모두 필요합니다. (프레임 워크에서 내부적으로 만들어 졌으므로 어쨌든 동작을 변경할 수 없습니다.)

싱글 톤을 사용하지 않기로 결정한 경우 차이가 날 수 있으므로 DAL 인스턴스는 가볍지 만 일반적으로 그렇지 않습니다. .

참고 : 연결 풀에 대해 이야기 할 때주의해야 할 유일한 중요한 사항은 '늦게 닫고 일찍 마감'패턴을 따르는 것입니다. 즉, 가능한 한 연결 열기를 지연시키고, 필요한 모든 작업을 마친 후에 최대한 빨리 닫으십시오.

이 마법 규칙을 사용하여 모든 시스템을 구축 한 후 연결 문자열 매개 변수로 재생하여 일부 풀 옵션 (초기 크기, 최대 크기 등)을 변경할 수 있습니다.)

0

DAL의 경우 싱글 톤을 사용하는 것에 대해 약간 불안합니다. 둘 이상의 데이터베이스 백엔드를 사용하려면 어떻게해야합니까? 아마도 송장에 MsSQL을 사용하고 인증에는 Active Directory를 사용하고 싶습니다. 아니면 포럼 게시판에 MySQL을 사용하고 싶을 수도 있지만 지리적 클러스터링을위한 PostgreSQL (좀 더 사실적입니다. ㅎ). Singleton Interfaces는 모의 데이타베이스 연결을 테스트에 통과 할 수 없을 때 데이터베이스 레이어 테스트를 훨씬 더 어렵게 만들 수 있습니다.