현재 기초코드테이블이 한 50여개 되고...
주 테이블을 맹글어가면 오라클과 전쟁중에 있습니당...^^
질문요지를 말씀드리면 Open된 테이블이 많다보니 어느날 갑자기 에러가 떴는데...
메모리가 부족하다는 메시지더군여.. 이거가 문제입니다.
그럼 워떻게 했길래 이지경에 이르렀는가...를 말씀드려야겠죠?
현재까지 DB작성기법을 제 나름대로 살펴보면...
그 옛날 코볼스타일...에서 습관처럼 내려온 기법...
1) 1 TDBModule,1 TDatabase, 1 ~ 3 TQuery + Only StringGrid를 조합해서 처리하는식..
2) 1 TDBModule,1 TDatabase, 다수의 TTable, 다수의 TQuery 혼용,,, 온리 DBGrids...
3) 1 TDBModule,1 TDatabase, 다수의 TQuery + 약간의 TTable DBGrid + StringGrid조합
4) 다수의 TDBModule,각각의 TSession, 다수의 TDatabase, 다수의 TQuery, 다수의 TTable.. DBGrid + StringGrids의 조합..
어찌 위 4가지 모델로 모든 DB어플작성 모델을 포괄할 수 있겠습니까만은..
저의 경우 델파이 Demo의 MastApp를 근간으로하되...
기초코드에는 TTable과 TDbgrids, 메인처리는 TTable+TQuery+TStrinGrid 를 혼용해서 처리하고 있고, 각각의 TSession을 포함한 다수의 TDBModule을 사용하면서..
해당화면이 열릴때마다 Session을 Active하고 각각 필요한 Table을 오픈해서 사용하고 있져...
문제는 50개가 넘은 기초테이블이 Default Session으로 된 메인 DBModule에 있고...
이를 각 DBModule에서 포함하는데다... 각각의 DBModule에는 2~30여개의 테이블과 Query가 사용되고 있는데...
각 DBModule 내에 포함된 TDatabase를 컨넥트한 상태 + TSession is Active 상태로 Windows2000에서 2회 실행시 메모리 부족 에러메시지가 발생하더라는 것입니다...
테스트결과 각 DBModule내에 포함된 TSession의 Active를 False로 하고..동적으로 필요할 때마다 Active시키면 2회까지도 실행이되지만 3회 실행해서 동시에 3개를 띄울수 없다는 겁니다...
물론 프로그램을 여러개를 띄워야 하는가..그런건 아니고요...
이런증상으로 보아..서 앞으로 프로젝트를 더 진행하면서 TDBModule과 TSession이 추가되면...
한개의 프로그램 내부에서 MDI로 열리는 프로세스마다 필요로하는 TDBModule에 딸린TSession이 열린텐데...여러개의 화면을 열었을 경우...메모리 부족 메시지가 날 우려가 있다는 것입니다..
이상도 하지... 메모리는 빵빵한데 왠 메모리 부족이 날까요?
가상메모리 늘려도 소용없고... 혹시 이런경험 해보신분 계신가요?
진짜로 이게 문제가 된다면... 기초코드 테이블들과..
Master-Detail로 묶고 Lookup을 처리하기위해 사용한 TTable을 죄다 포기하고..
TQuery로 바꿔야 할 거 같고...
그랬을 경우.. 기초코드처리 루틴을 왕창 뜯어고쳐야할 거 같은 불길한 느낌이 드는군요...
화면마다 필요한 기초코드테이블과 메인테이블 포함 20개 정도 오픈해놓은 상태인데도... 메모리부족이라..
TSession의 정확한 의미를 모르겠군요..내부적으로 어떻게 처리하는건지...
부탁합니당..
아주 비슷한 경험이 있어서요...
적어 봅니다...
그때 제가 첫번째로 만났던 에러는
stack overflow 에러 였죠...(메모리 부족 메세지두 가끔 떨어지더군요...)
알고 봤더니...
procedure TfForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Table1.Active then
Close; // 저는 Table1을 닫으라고 쓴건데여...
// 사실은 이자식이 폼 클로스 이벤트를 부르더군요...
// 계속 자기 자신의 프로시저를 호출하니깐
// stack overflow나 메모리 부족 메세지를 뛰우더군요... 쩝...
// Table1.Close -> 요렇케 코딩하니깐 잡히더군요... 쩌비..
Action := caFree;
end;
두번째 문제는 님처럼 테이블이 너무 많다는 거 였습니다...
그래서 폼을 열거나 닫을 때 테이블 오픈과 클로스 명령을 계속 해줬습니다...
procedure TForm1.FormCreate(Sender: TObject);
begin
if not Table1.Active then
Table1.Open;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Table1.Active then
Table1.Close;
Action := caFree;
end;
세번째 문제는 역시 님처럼 자식폼들을 계속해서 불러 대니깐...
이놈이 메모리 부족 메세지를 띄우더군요...
그래서 저는 용감하게(무식하면 용감합니다...T.T) 다른 자식폼을 부를 땐
항상 현재 생성 되어있는 자식폼을 죽이고 새로 부를 폼을 불렀습니다...
그 뒤로 전 고 메모리 부족 메세지는 보지 못했습니다...
근데 참 이상한 건요...
아래내용은 지가 직접 테스트해본 결괍니다...
전 Win 98을 쓰는데
메모리가 64메가 건 128메가 건 메모리 사용하는 게 비슷하더군요...
2경우다 델파이 한 다섯개 정도 띄우면
메모리 부족 메세지 떨어지더군요...
NT는 안 그러던데...
저두 님의 경우처럼 메모리 부족 문제에 대해 관심이 많습니다...
혹시 정확한 문제점을 파악하셨으면 멜좀 주세요...
항상 건강하세요...^_^