2010-12-22 3 views
0

시나리오 :NHibernate를 이용한 병렬 삽입

통합 데이터베이스에서 프로덕션 데이터베이스로 많은 엔티티를로드해야합니다. 우리는 Hibernate를 사용하여 prod DB에 물건을로드합니다. 관련 비즈니스 규칙이 영속 엔티티를 사용하여 C#으로 이미 작성 되었기 때문입니다. 모든 것이 정상적으로 실행되고 우리는 유효한 엔티티를 DB에로드합니다. RDBMS는 SQL Server 2005 (2008 년으로 업그레이드 가능)입니다.

문제 :

기관의 수는 굉장히 빨리 성장할 것로드하고 우리가 예상했던 것보다 더 오래 걸릴 및 고객의 요구 사항을 충족하지 못할 것이라고 확신합니다.

솔루션 (?) :

단순히 병렬로 일을 실행하기 쉽다는 : 버킷으로 모든 엔티티를 분할 및 병렬로 가져옵니다.

문제는 모두 동일한 테이블에 삽입되고 모든 프로세스가 테이블 잠금에서 병목 현상을 일으키는 것입니다.

그래서 질문은 : 동일한 테이블에 삽입하려고하는 다른 트랜잭션에 대해 테이블을 잠그지 않는 방식으로 이러한 삽입을 만드는 방법이 있습니까? 스냅 샷 격리 수준에 대해 들었지만 실제 사용하는 사람을 찾지 못했습니다. 모든 지침을 부탁드립니다.

답변

1

다른 테이블 (설명 된 것처럼 "버킷"당 하나)에 삽입하고 뷰에 결합 할 수 있습니까? 고객이 로딩 시간이 80 % 감소한 것을 제외하고는 차이점을 보지 못했습니다 ...

1

NHibernate에 대한 경험이 없지만 .NET에서 SqlBulkCopy를 사용하여 대량으로 데이터를 대량로드 할 수 있습니다. 대량 삽입물/BCP). 로드중인 테이블에 TABLOCK을 적용하면이 대량 작업이 테이블에 대한 대량 업데이트 잠금을 해제하고 대량 업데이트 잠금이있는 프로세스가 2 개있는 경우 잘 수행됩니다. 힙 (테이블에 클러스터 된 인덱스 없음)에로드해야합니다.

예를 들어, 독점적 인 테이블 수준 잠금을 획득하여 서로를 차단하는 여러 프로세스가 INSERT ... SELECT를 수행하는 경우와 반대입니다.

this MSDN article - 더 많은 세부 정보가 필요합니다. 다행히도 이런 종류의 일이 가능할 것입니다.

또한 가능한 경우로드하기 전에 표에서 색인을 제거한 후 나중에 다시 작성하면로드 속도가 빨라집니다.

+0

시스템이 동안 온라인 상태를 유지해야하기 때문에 시나리오가 섬세를 사용하는 자 NHibernate를 사용하지 마십시오 일괄 처리로드 – Pedro

2

제 생각에는 10.4 Optimistic concurrency control 장이 여러분의 일을 끝내는 데 도움이 될 것 같습니다. 이 유형의 삽입에 대해 명시적인 격리 수준을 정의 할 수 있습니다. 이 기사에서는 버전 관리를 사용하는 것이 좋지만 데이터가 삽입되어 있지만 업데이트 할 수없는 경우에는 건너 뛸 수 있습니다. 이 경우 마지막 커밋이 이깁니다.

1

"올바른 도구를 사용하여 한 가지를 수행합니다"

, 대량 삽입을 일반 ADO.NET 명령 및 대량 삽입

+0

그리고 중복 된 비즈니스 규칙이 있습니까? No thanks – Pedro

+2

@ 페드로 :이 접근법은 반드시 비즈니스 규칙을 복제해야 함을 의미하지는 않습니다. 도메인 엔터티를 만들고 유효성 검사를 확인한 다음 유효성 검사를 마친 데이터를 대량 삽입을 위해 DataTable에 채우지 못하게하는 요소는 없습니다. – DanP