윈도우 2000, 델파이 5.0, indy 9 최신 베타판 에서 서버 프로그램 작성중입니다...
소켓관련하여 서버프로그램이 경험이 많치 않은 관계로 몇가지 난관에 부딪쳤네요...
9버전의 데모를 응용하여 만들어서 클라이언트 개발자와 테스트 중인데...
쓰레드 onExecute 이벤트 안에서 프로그램의 처리를 하는데...
일단 클라이언트의 요구가 오면 TQuery를 동적생성한후 사용자 인증 후
해당쿼리 해제한 후 요구에 해당하는 쿼리를 동적 생성 발행하여
하나의 패킷의 크기에 맞게
잘게 쪼개면서 채워지며 보내는 형태로 진행 합니다...
즉 두번째 쿼리에서는 쿼리가 끝이 될때까지 반복을 수행하는데...
이게 테스트 과정에서 자동으로 죽어버리는 군여 서버프로그램이
기존에서는 연결시에 리치에디트에다 뿌려 놨더니 리치에디트 DLL 오류가
발생합니다.(아마도 너무 빠르게 돌다 보니 개가 감당을 못하는것 같기에
디스플레이 루틴을 제거하고) 했더니 해당 에러는 발생하지 않는데 자동죽네요
아마도 요구가 많으니 서버에 할당되는 메모리의 부하가 상당한간 봅니다...
해당 테스트 서버가 ibm 왓스 서버가 셋팅 되어 있어서 그런지 쓰레드가
800개 가까이 돌고 있는 것 같은데...(메모리 2기가 일반 PC서버)
메모리는 널널한것 같은데...
그래서설라무네 쿼리부분을 제거하고 나니 몇배의 접속자 요구에도 프로그램이
죽는 현상이 없어졌습니다...
동적 생성 쿼리의 생성이 문제 일것 같기에 집으로 걸어오면서 생각해봤는데
1.
쿼리를 동적으로 생성하는 것에 갯수 제한을 둬야 할것 같기도 하고
2.
서버의 클라이언트 동시 연결 갯수 제한을 둬야 할것 같기도 하고
3.
로칼 동적으로 생성하는 쿼리를 타이머를 돌려서 전역의 한개의 쿼리를 만들고(select)
쓰레드 내부에서는 쿼리를 생성하는게 아니라 읽혀진 쿼리를 반복하면서 요구에
맞게 위치를 찾아서 보내야 할지?
어떤 방법이 좋을 지 관련 경험 계신분 답변 좀 부탁 드립니다...
2.일 경우 만약 100명이 접속하더라도 서버에서 10개로 한정한다면 나머지
90명의 연결자 어떤 현상이 발생하는지요?
어떤 방법이 가장 좋을까요?
저두 인디로 서버 프로그램 만드는것에 대해 많은 고민을 해보았습니다만..
현재 한 10여명 붙여서 테스트 한결과 이상은 없어서 많은 유저에대한 자부심을
가지고 있습니다만.
일단..제 생각을 말씀 드리면..
TQuery를 쓰신다구 하셨는데...
정확한 이유는 모르겠습니다만..저두 TQuery와 TADOQuery를 사용하다..
관둔적이 있었습니다.
TADOQuery 같은경우...WIN2000의 작업 관리자로 보면 디비에 접속 하는 경우
리소스(핸들갯수 증가, 스레드 갯수 증가)가 계속해서 증가 하는 현생이 발생