|
하나의 CriticalSection을 2개의 thread에서 동기화를 시킨다는 내용은 CriticalSection을 하나만 선언하신 후, 이 CriticalSection을 각각의 thread에서 호출해 사용하시라는 겁니다. 즉 하나의 임계영역만 선언하셔야 각각의 thread에서 이를 인지하고 임계영역을 보호할 수 있겠지요.
이전 예제처럼 2개의 임계영역을 설정하신 후에 각각의 쓰레드에서 각각의 임계영역을 액세스하게되면, 선언은 2개의 임계영역이지만, 결국은 하나의 리소스, 즉 하나의 ADOConnection에 다수의 쿼리가 요구를 하게 되니까요...
이부분이 결국 "Project TEST.EXE raised exception class EOleException -- '다른 명령 결과 때문에 연결을 사용중입니다.', ---" 라는 에러를 발생시킨걸로 보입니다.
그러면 결국 하나의 CriticalSection을 선언하신 후, 60여개의 장비에서 올라오는 데이터를 핸들링해야 된다는 내용이 될것 같은데.. 이러면 이전에 설계내지는 코딩하신 방식을 보면 쓰레드가 60여개 또는 이번에 질문하신대로 10여개 이상이 되는데.. (쓰레드 또는 CriticalSection 질문하신 내용을 보면..)
실제 60여개의 장비에서 30초 정도의 간격으로 올라오는 데이터라면... (각각의 장비가 30초인지 전체장비가 30초인지는 잘 모르겠으나.. ^^;) 크게 많은 로드가 걸릴걸로 보이지는 않습니다만...
그러나 DB 서버가 원격인지, 로컬인지 등등 여러가지 유동적인 상황이 있을 수 있습니다. 이런부분은 해당 개발자가 아니니 정확히 짚어드리기는 힘들것 같습니다.
일단 제가 추천드리고 싶은 방법은 장비에서 올라오는 데이터들을 하나의 pool에 저장하시는 부분과 이 pool의 내용을 읽어들여서 DB로 저장하는 부분으로 분리하시는 것이 어떨까 합니다. 그러면 데이터들이 올라오는 부분은 이벤트로 처리가 될것이고, 데이터를 DB로 저장하는 부분만 쓰레드로 작성하신 후에 계속 data pool만 감시를 하시면 될것 같은데요....
그럼, 좋은 결과 있으시길 바랍니다.
초보 님이 쓰신 글 :
: 답변 감사합니다.
: 말씀하신데로 각각의 Query가 하나의 ADOConnection에 연결되어 있습니다.
:
: 답변중에 하나의 CriticalSection을 2개의 thread에서 동기화를 시킨다는 말씀은?
: (제가 스레드는 처음 사용거라서요.)
:
: ADOConnection과 Query를 쌍으로 묶으면 CriticalSection가 개별적으로 동작해도 놓치는것 없이
: 저장은 다되겠지요?
: 질문은 샘플로 2개만 올렸지만 실제로 저장부분은 10개 이상이 되거든요. (프로시져로 저장부분)
: ADOConnection과 Query를 쌍으로 10개 이상 묶어도 문제가 없나요? (속도나 cpu 점유율등.)
:
:
:
: smleelms 님이 쓰신 글 :
: : 각각의 Query가 하나의 ADOConnection에 연결되어 있나요?
: :
: : 그렇다면 아래의 코드만을 볼때에는 하나의 ADOConnection을 통해 2개의 Query가 동시에 실행될 여지가 충분히 있습니다. 왜냐하면 thread1의 CriticalSection1과 thread2의 CriticalSection2는 서로 개별적으로 동작하기 때문에 동기화가 이루어지지 않습니다.
: :
: : 아래에 질문하신 것처럼 하나의 CriticalSection을 2개의 thread에서 동기화를 시키셔야 될걸로 보입니다.
: :
: : 아니면 ADOConnection과 Query 2개를 각각 쌍으로 사용하시고 실제 DB쪽의 무결성은 SQL 서버에 맞기시는 것도 한 방법으로 보입니다만...
: :
: : 이상 허접답변이었습니다..
|