2009-05-13 6 views

답변

1

BeginExecuteNonQuery가 작동하지 않습니까?

+1

. 필자는 DB2 .NET 데이터 공급자에 대해 알지 못합니다. 오라클의 경우 비동기 기능을 직접 수행해야했습니다. – RichardOD

0

문제는 BeginExecuteNonQuery가 없다는 것입니다.

2

적절한 방법은 시나리오에 따라 달라질 수 있습니다.

오라클에서 내가 수행 한 작업 항목 ID 대기열을 기반으로 DB에서 1000 개 항목의 XML 항목을 가져오고있었습니다. 한 번에 datareader를 사용하여 작업을 수행하지 못했기 때문에 여러 스레드에서 한 번에 하나씩 꺼 냈습니다 (각 스레드는 대기열이 비어있을 때까지 대기열에서 작업 항목을 가져 왔습니다). 각각의 스레드가 결과를 얻었을 때에 기반한 프로듀서 소비자 대기열에 XML을 넣습니다. 별도의 스레드가 생산자 고객 대기열을보고 데이터에서 XSL 변환을 수행하여 파일에 썼습니다. 물론 처음에는 단일 스레드로 수행하는 벤치마킹 이었지만이 작업은 상당히 느립니다.

내가 (스레딩에 대한 일반적인 조언이 가능한 스레드 풀을 사용하는 것입니다으로 대표 간접적으로도 않는) 당신은 64 개 이상의 항목이없는 제공 작동 할 수있는 시작합니다 threadpool/ asynchronous delegates를 사용하여 시도

할 것. WaitHandle.WaitAll usually has a limit of 64 work items.. 나는 1000s를 가지고 있기 때문에 좋은 선택이 아니었다.

메모리에서 나는 각각의 작업이 더 이상 없을 때 생산자 스레드를 정상적으로 종료 한 다음 생산자 소비자 대기열도 비어있을 때까지 차단합니다.

가장 중요한 것은 각 스레드에 DB 개체를 완전히 분리해야한다는 것입니다. 그렇지 않으면 스레딩 문제가 발생하여 비틀 거립니다.

Windows 양식/WPF 응용 프로그램에서 비동기 저장 프로 시저를 실행하려는 경우 background worker component을 사용하는 것이 좋습니다.

추가 정보가 필요하시면 알려주세요.

1

DB2가 BeginExecuteReader를 지원하지 않으면 비동기 대리자를 사용하여 트릭을 수행 할 수 있습니다. 기능적으로, 내장 된 것을 사용하는 것보다는 스스로 구현하는 것을 제외하고는 똑같은 것이다.

확인 여기에 예 : sql async query problem… 확실히 더 BeginExecuteNonQuery이 없음을 오라클의 경우

관련 문제