Q&A

  • 다수의 TTable vs TQuery and TSession=메모리부족?
현재 기초코드테이블이 한 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의 정확한 의미를 모르겠군요..내부적으로 어떻게 처리하는건지...

부탁합니당..





3  COMMENTS
  • Profile
    왕초초초보 2001.01.09 02:22
    저두 MDI 형식에 오라클로 프로젝트를 진행한 적이 있었는데요...



    아주 비슷한 경험이 있어서요...



    적어 봅니다...



    그때 제가 첫번째로 만났던 에러는



    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는 안 그러던데...





    저두 님의 경우처럼 메모리 부족 문제에 대해 관심이 많습니다...



    혹시 정확한 문제점을 파악하셨으면 멜좀 주세요...



    항상 건강하세요...^_^

  • Profile
    황광일 2001.01.09 03:16
    > procedure TfForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    > begin

    > if Table1.Active then

    > Close; // 저는 Table1을 닫으라고 쓴건데여...

    > // 사실은 이자식이 폼 클로스 이벤트를 부르더군요...

    > // 계속 자기 자신의 프로시저를 호출하니깐

    > // stack overflow나 메모리 부족 메세지를 뛰우더군요... 쩝...

    > // Table1.Close -> 요렇케 코딩하니깐 잡히더군요... 쩌비..

    > Action := caFree;

    > end;



    당연히 해야하는 거고..



    >

    > 두번째 문제는 님처럼 테이블이 너무 많다는 거 였습니다...

    > 그래서 폼을 열거나 닫을 때 테이블 오픈과 클로스 명령을 계속 해줬습니다...



    저도 그렇게 해줬습니다.



    >

    > 세번째 문제는 역시 님처럼 자식폼들을 계속해서 불러 대니깐...

    > 이놈이 메모리 부족 메세지를 띄우더군요...

    >

    > 그래서 저는 용감하게(무식하면 용감합니다...T.T) 다른 자식폼을 부를 땐

    > 항상 현재 생성 되어있는 자식폼을 죽이고 새로 부를 폼을 불렀습니다...

    >

    > 그 뒤로 전 고 메모리 부족 메세지는 보지 못했습니다...

    >

    > 근데 참 이상한 건요...

    >

    > 아래내용은 지가 직접 테스트해본 결괍니다...

    >

    > 전 Win 98을 쓰는데

    >

    > 메모리가 64메가 건 128메가 건 메모리 사용하는 게 비슷하더군요...

    >

    > 2경우다 델파이 한 다섯개 정도 띄우면

    >

    > 메모리 부족 메세지 떨어지더군요...

    >

    > NT는 안 그러던데...



    당연히 안그래야 정상이죠...Windows2000이니까요...

    말하자면 시스템 리소스문제는 아니라는 겁니다.

    BDE쪽에서 걸리는 에러메시지거던요?

    정확한 메시지는 다음과 같습니다.



    Exception EDBEngineError in module @(#*$&.exe at 000D1BF6.

    Insufficient memory for this operation.

    Alias: @$@#$&



    엔진쪽에서 메모리가 부족하다는거에요...

    나이거 원...

    델파이가 왜 이러나...

  • Profile
    몰러 2001.01.09 06:47
    BDE엔진에서 Insufficient에러가 발생하는 원인은 실제로 시스템의 메모리가 부족해서 그러는 경우는 거의 없습니다. 여러가지 원인이 있을 수 있는데 다른 AV에러가 많이 발생하는 프로그램을 try-except-end문을 써서 강제로 실행하면 내부에서 BDE와 메모리 충돌이 일어나는 경우가 많습니다. 그외 원인은 많은데 대부분 BDE의 문제라기 보다는 프로그램이나 Custom Component의 문제더군요

    프로그램을 다시한번 체크해 보는 것이 가장 좋은 방법이더군요



    황광일 wrote:

    > > procedure TfForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    > > begin

    > > if Table1.Active then

    > > Close; // 저는 Table1을 닫으라고 쓴건데여...

    > > // 사실은 이자식이 폼 클로스 이벤트를 부르더군요...

    > > // 계속 자기 자신의 프로시저를 호출하니깐

    > > // stack overflow나 메모리 부족 메세지를 뛰우더군요... 쩝...

    > > // Table1.Close -> 요렇케 코딩하니깐 잡히더군요... 쩌비..

    > > Action := caFree;

    > > end;

    >

    > 당연히 해야하는 거고..

    >

    > >

    > > 두번째 문제는 님처럼 테이블이 너무 많다는 거 였습니다...

    > > 그래서 폼을 열거나 닫을 때 테이블 오픈과 클로스 명령을 계속 해줬습니다...

    >

    > 저도 그렇게 해줬습니다.

    >

    > >

    > > 세번째 문제는 역시 님처럼 자식폼들을 계속해서 불러 대니깐...

    > > 이놈이 메모리 부족 메세지를 띄우더군요...

    > >

    > > 그래서 저는 용감하게(무식하면 용감합니다...T.T) 다른 자식폼을 부를 땐

    > > 항상 현재 생성 되어있는 자식폼을 죽이고 새로 부를 폼을 불렀습니다...

    > >

    > > 그 뒤로 전 고 메모리 부족 메세지는 보지 못했습니다...

    > >

    > > 근데 참 이상한 건요...

    > >

    > > 아래내용은 지가 직접 테스트해본 결괍니다...

    > >

    > > 전 Win 98을 쓰는데

    > >

    > > 메모리가 64메가 건 128메가 건 메모리 사용하는 게 비슷하더군요...

    > >

    > > 2경우다 델파이 한 다섯개 정도 띄우면

    > >

    > > 메모리 부족 메세지 떨어지더군요...

    > >

    > > NT는 안 그러던데...

    >

    > 당연히 안그래야 정상이죠...Windows2000이니까요...

    > 말하자면 시스템 리소스문제는 아니라는 겁니다.

    > BDE쪽에서 걸리는 에러메시지거던요?

    > 정확한 메시지는 다음과 같습니다.

    >

    > Exception EDBEngineError in module @(#*$&.exe at 000D1BF6.

    > Insufficient memory for this operation.

    > Alias: @$@#$&

    >

    > 엔진쪽에서 메모리가 부족하다는거에요...

    > 나이거 원...

    > 델파이가 왜 이러나...