2011-03-26 4 views
3

SQL Server에서 50 개의 테이블을 DataSet으로로드하고이를 기반으로보다 복잡한 데이터 구조를 만든 다음 데이터를 캐시하여 웹 응용 프로그램을 더 빨리 실행할 수있는 웹 응용 프로그램을 보유하고 있습니다.데이터 집합에 병렬 로딩하는 데 문제가 있습니까?

응용 프로그램의 초기로드에는 약 10 초가 걸리고, 그 중 절반은 단순히 데이터베이스 테이블에서 데이터를로드하는 것입니다. 이것은 생산 단계에서는 합리적이지만 개발 과정에서 좌절감을 갖습니다. 나는 일을 빠르게하고 싶다.

내가 현재 가지고하면 다음 의사 코드와 유사한 :

var ds = new DataSet(); 
var tablesToFill = new List<string>() { ... }; 
connectToDatabase(); 
foreach (var t in tablesToFill) fill(ds, t); 
disconnectFromDatabase(); 

채우기 (데이터 집합, 문자열) 방법 기본적으로 유사한 채 웁니다 '{TABLENAME}에서 선택 *;' DataSet.Tables [tablename]

병렬로로드하면 작업 속도가 빨라지는지 궁금했습니다.

먼저 연결 문자열 (SqlClient)에 MultipleActiveResultSets = true를 추가했습니다. 그런 다음 다음과 같은 의사 코드를 시도 :

var ds = new DataSet(); 
var tablesToFill = new List<string>() { ... }; 
connectToDatabase(); 
ds.EnforceConstraints=false; // without this, get concurrency errors in DataSet 
tablesToFill.AsParallel().ForAll(t => fill(ds,t)); 
ds.EnforceConstraints=true; 
disconnectFromDatabase(); 

이 제대로 작동하는 것처럼 보입니다. 2 개의 다스 테이블의 하위 집합에서로드 시간이 66 % (2.7 초에서 0.9 초)로 줄었습니다.

나중에 돌아올 수 있다는 사실을 알고 있어야합니까? MSDN에 따르면 DataSet에서 쓰기 작업을 동기화해야하지만 다른 테이블에 모두 쓰는 것이므로 제대로 작동하는 것으로 보입니다. 그러나, 나는 운이 좋고/또는 시나리오 (또는 .NET의 버전)에 문제가있는 곳이 있습니까?

감사합니다.

편집 : 스레드 안전성으로 인해 위험하다고 판단되는 경우, 각 채우기 작업을 자체 DataSet에 병렬 처리 한 다음 모든 DataTable을 공통 DataSet (동일한 스레드)으로 이동하는 방법에 대해 생각해보십시오. & 데이터 테이블을 하나의 DataSet에서 다른 데이터 세트로 매우 신속하게 다시 연결할 수 있다고 가정합니다 (데이터를 복제 할 필요없이 O (1) 시간).

+0

실제 코어가 여러 개인 머신에서 실행하고 있습니까? MSDN이 동기화라고 말하면 동기화해야합니다. –

+2

멀티 스레딩 버그는 프로덕션에만 나타나는 나쁜 경향이 있습니다. MSDN에서 스레드로부터 안전하지 않다고 말하면 나는 그들의 말을 따를 것입니다. – driis

+0

코어 i7에서 실행 중. 단 하나의 물리적 프로세서, 다중 코어. 여기서 문제가 발생하지 않는다면 물리적 인 프로세서가 여러 개인 머신에 설치해야합니까? –

답변

2

어떻게 왜 추가 한 후 별도의 DataTables를 작성하지 병렬 만의 독특한 데이터 집합의 각 채우기 작업을 할 수 데 다음 (동일한 스레드에서) 공통 DataSet으로

을 모든 DataTables 이동에 대한 DataTables를 DataSet으로 가져옵니다.

DataSet에 데이터를 저장하기 전에 마지막 DataTable이 채워질 때까지 기다려야하므로 아무런 문제가 없습니다.

+0

또한 연결을 유지하는 여러 테이블 어댑터를 만들어야하므로 트레드 풀 연결을 만드는 것이 좋습니다. – Damian

관련 문제