|
우선 상황은 이렇습니다.
C빌더6.0 으로 작성하고 있습니다.
장비 120대 정도를 제어해야하는 서버 환경입니다.
장비쪽에서 커넥을 하면 상태정보를 주고 받고
서버는 연결된 장비에 최종으로 전송한 이미지를 다시 전송하게 됩니다.
문제는
120대의 장비가 서버로 커넥을 할 경우 처음 60대 정도는 DB에서 이미지를 읽어와 전송이 제대로 됩니다.
그런데 60번째로 접속하는 장비에 이미지를 전송하려고
DB에서 이미지를 읽어 들이는 쿼리
sSQL = "SELECT LIB_IMG FROM LIB_IMAGE WHERE LIB_NO = '3'";
OpenQuery(ADORSInc, sSQL);
이런 단순 쿼리 인데도 쿼리 에러가 나버립니다.
처음 접속된 60대의 장비는 이 쿼리가 문제 없이 실행됩니다.
쿼리 오픈시 혹시나 해서 에러 메세지를 찍어보니
ORA-00604 : 순환 SQL 레벨 1 에 오류가 발생했습니다.
ORA-01000 : 최대 열기 커서 수를 초과했습니다.
이런 오라클 에러가 뜹니다.
밑에 쿼리 오픈 함수입니다.
(catch 문에 걸려 -1을 리턴에서 정확한 패킷이 만들어지지 않는 상황)
int OpenQuery(TADOQuery* ADORS, AnsiString strsql)
{
int iCnt;
CoInitialize(NULL);
try {
ADORS->SQL->Clear();
ADORS->Close();
ADORS->SQL->Add(strsql);
ADORS->Open();
} catch (Exception &e) {
//ShowMessage("OpenQuery() : " + e.Message);
ADORS->Close();
::CoUninitialize();
return -1;
}
iCnt = ADORS->RecordCount;
::CoUninitialize();
return iCnt;
}
그리고 이건 찾다가 혹시나 해서 같이 씁니다.
지금 장비 120대에 대한 객체 생성을
while(!ADORS->Eof)
{
m_pList[index] = new CObject(this);
index++;
}
이렇게 120대 장비에대한 객체를 생성하구요.
CObject 클래스에서 위에 내용인 패킷 생성 및 이미지 전송, 리시브을 처리 하고 있습니다.
소켓은 TServerSocket을 쓰고있습니다. <- (통신부가 쓰레드로 처리가 안되어 있습니다. 이 부분도 문제인가요?)
OpenQuery는 공통 함수로 처리를 하구요.
이런 경험있으신분들 조언좀 부탁드립니다.
|