Q&A

  • 마이다스에서 멀티(MULTI)접속시 에러
현재 저희는 마이다스를 구현해서 시스템을 하나 오픈했는데,

궁금하고, 잘모르는 부분이 있어서 부탁드리겠습니다..

현재 개발환경은

DB서버는 AS400이고, DELPHI5에 3-TIER방식으로

SOCKETCONNECTION을 사용하고 있습니다.

클라이언트프로그램은 60본정도되고, 서버프로그램은 각관리별로 6본입니다.

근데, 마이다스가 런닝되는데, 문제가 생겨서요.



첫번째.. 궁금한 사항은 서버프로그램 작성시 RemoteDataModule생성시에

Instancing에서 선택하는 Multiple Instance와 Single Instance의 차이점을 알고 싶어요..

Multi로 하면 서버프로그램이 하나만 뜨지만,

Single로 하면 클라이언트수 만큼 서버프로그램이 뜨거든요..



두번째..궁금한 사항은

Multi방식으로 서버프로그램을 작업했을때..

하나의 서버프로그램에 여러 유저가 접속되어져 있어,

한명의 유저가 Down되어 서버를 다운시키면, 나머지 다른 유저들도 사용을 못해

강제로 SocketSever를 죽여 주어야 되는데,

이런 문제점때문에, Single방식으로 서버프로그램을 만들었을때..

하나의 서버프로그램이라도, 접속된 유저수 만큼 서버폼이 뜹니다..

이때.. 일정수 이상이 접속하면

아래의 메세지를 보여주고 마이다스서버가 다운되어버립니다..



=======================================================

"Insufficient memory for this operation"

"Alias : '제가만든 알리아스 이름 혹은 연결한 데이터베이스 명'"

=======================================================

혹시 이런문제점을 알고 계시면, 친절한 조언 부탁드리겠습니다..



3  COMMENTS
  • Profile
    제덕모/마으미 2001.06.07 23:58
    첫번째 : Multiple Instance와 Single Instance

    멀티는 말 그대로 하나의 애플리케이션 서버의 데이타모듈부분을 모든

    클라이언트들이 공유해서 사용합니다. 이경운 전역변수문제라든지

    프로시져가 동시에 작업이 들어갔을때 쓰레드 충돌같은 걸 염두해

    두셔야 합니다. 안그러면 하루에도 수십번 따운 현상을 겪을실 겁니다.

    (제가 그랬었읍니다. ㅠㅠ)



    싱글은 애플리케이션 서버와 클라이언트와 1:1로만 작업을 합니다.

    결국 메모리가 많이 필요로 하겠죠..(BDE 메모리가 특히..)

    님이 하시는 경우는 그냥 DCOM으로 하시는 것 같으신데 ..

    만약 전역변수를 쓰시고 있다면 전역변수를 없애는 방향으로 잡으시고

    (특정한 값이 필요로 하시다면 테이블 하나 만드셔서 작업을 하시고)

    특히 주의 해야할 것이 쓰레드 충동문제인데 이경운 프로시져 시작부분에

    Lock을 걸어주시고 끝나는 부분에 Lock을 해재시켜주시면 엉뚱한

    충동은 안일어 날것입니다.



    두번째 : "Insufficient memory for this operation"

    BDE에 INIT부분에 보시면 MEMSIZE와 SHAREDMEMSIZE부분의 용량을

    조정해주시면 됩니다. 각 데이타베이스 컴포넌트 하나 붙으므로 해서

    그만큼의 메모리가 필요로 하니까요..

    계산법은 DELPHI5 CONTACT에 나와있습니다.

    이 책은 하나 사셔서 두고 두고 보시는게 좋겠다는게 제 생각입니다.

    그래서 자세한 계산법은 안
  • Profile
    오인균 2001.06.08 01:25
    이렇게.. 답변을 주셔서 정말 감사합니다..

    제덕모님께서 말씀하신 내용은 저희도 시행착오를 거쳐서

    많이 힘들었습니다..

    근데.. Procedure의 시작부분에 Lock을 걸고, 끝나는

    부분에 Lock을 풀어주라고 하셨는데..어떤 충돌을 막을수 있는것인지요..?

    그리고, Lock은 어떤 방식으로 거는건지요.ㅇ.?

    정확히 머리속에 로직이 안서내요..

    죄송하지만, 자세한 설명 좀 부탁드리겠습니다..







    제덕모/마으미 wrote:

    > 첫번째 : Multiple Instance와 Single Instance

    > 멀티는 말 그대로 하나의 애플리케이션 서버의 데이타모듈부분을 모든

    > 클라이언트들이 공유해서 사용합니다. 이경운 전역변수문제라든지

    > 프로시져가 동시에 작업이 들어갔을때 쓰레드 충돌같은 걸 염두해

    > 두셔야 합니다. 안그러면 하루에도 수십번 따운 현상을 겪을실 겁니다.

    > (제가 그랬었읍니다. ㅠㅠ)

    >

    > 싱글은 애플리케이션 서버와 클라이언트와 1:1로만 작업을 합니다.

    > 결국 메모리가 많이 필요로 하겠죠..(BDE 메모리가 특히..)

    > 님이 하시는 경우는 그냥 DCOM으로 하시는 것 같으신데 ..

    > 만약 전역변수를 쓰시고 있다면 전역변수를 없애는 방향으로 잡으시고

    > (특정한 값이 필요로 하시다면 테이블 하나 만드셔서 작업을 하시고)

    > 특히 주의 해야할 것이 쓰레드 충동문제인데 이경운 프로시져 시작부분에

    > Lock을 걸어주시고 끝나는 부분에 Lock을 해재시켜주시면 엉뚱한

    > 충동은 안일어 날것입니다.

    >

    > 두번째 : "Insufficient memory for this operation"

    > BDE에 INIT부분에 보시면 MEMSIZE와 SHAREDMEMSIZE부분의 용량을

    > 조정해주시면 됩니다. 각 데이타베이스 컴포넌트 하나 붙으므로 해서

    > 그만큼의 메모리가 필요로 하니까요..

    > 계산법은 DELPHI5 CONTACT에 나와있습니다.

    > 이 책은 하나 사셔서 두고 두고 보시는게 좋겠다는게 제 생각입니다.

    > 그래서 자세한 계산법은 안
  • Profile
    마으미 2001.06.08 02:34
    긁적... 긁적..



    Procedure 프로시져이름;

    begin

    Lock;



    try

    with qryS1100 do begin

    try

    BMDB.StartTransaction;



    Close;

    Sql.Clear;

    Sql.Add := 'INSERT INTO .......';



    Sql.ExecSql;

    Sql.ApplyUpdates;



    BMDB.Commit;

    Sql.CommitUpdates;



    except

    BMDB.RollBack;

    그외 에러처리

    end;

    end;

    finally

    UnLock;

    end;



    end;



    우선 위의 경우는 제가 코바를 하면서 한겁니다.

    DCOM의 경운 트랙잭션 처리나 프로시져 동시 호출시 어떻게 처리가 되는지

    잘 모릅니다.(저도 예전에 DCOM연습할때 저런 락이라든지 트랙잭션을 별도로

    걸지 않아도 잘 되는 걸 경험했었습니다. 그런데 코바로 오면서 상황이

    틀려져서 저렇게 한겁니다.)



    락/언락은 위에 처럼 하시면되구요.

    위의 경우 트랙잭션이 한번 걸렸는데..

    다른 클라이언트에서 위에 프로시져를 호출할 경우

    트랙잭션이 한번 걸려있는 상태이기 때문에 에러가 발생합니다.

    (물론 현재 트랙잭션 상태인지 아닌지 체크해서 에러를 필할수도 있지만~

    코바는 로드밸런싱, 페일오버서비스가 기본 지원됩니다. 그러나

    애플리케이션 서버쪽은 수동으로 실행을 해주어야 합니다. 이 말은 항시

    애플리케이션 서버가 실행되고 있어야 한다는 겁니다. 결국 애플리케이션

    서버가 한개밖에 뛰어져 있지 않으면 모든 클라이언트가 한개의 애플리케이션

    서버로 붙어버리기 때문에 애플리케이션 내부적으로 데이타모듈 부분만

    새로운 인스턴스를 생성해서 동작을 하게되는데 어떻게 된것인지

    각 클라이언트의 프로시져 호출하는 부분이 계속 충돌 난다는 겁니다.

    에러가 계속 나더군요.. -처음부터 에러 날때두 있고 한참 돌아가다 날때도 있고-

    새로운 인스턴스를 생성해서 동작하는 건데 충돌이 난게 이해가 되지 않았습니다.

    그래서 위의 처럼 LOCK을 걸어주고 루틴이 끝나면 UNLOCK으로 락 걸어둔걸

    풀어주니 그런 일이 없어지더군요..



    Lock이라고 명시해준것은... ^__________^;;;;;;

    제가 영어가 짧아 HELP의 내용을 그대로 전달해드리지 못할것 같아

    원문 해석은 님에게 맏기겠습니다.

    자세한 설명은 Lock의 HELP를 찾아 보시면 상세하게 나와있습니다.

    그럼..



    오인균 wrote:

    > 이렇게.. 답변을 주셔서 정말 감사합니다..

    > 제덕모님께서 말씀하신 내용은 저희도 시행착오를 거쳐서

    > 많이 힘들었습니다..

    > 근데.. Procedure의 시작부분에 Lock을 걸고, 끝나는

    > 부분에 Lock을 풀어주라고 하셨는데..어떤 충돌을 막을수 있는것인지요..?

    > 그리고, Lock은 어떤 방식으로 거는건지요.ㅇ.?

    > 정확히 머리속에 로직이 안서내요..

    > 죄송하지만, 자세한 설명 좀 부탁드리겠습니다..

    >

    >

    >

    > 제덕모/마으미 wrote:

    > > 첫번째 : Multiple Instance와 Single Instance

    > > 멀티는 말 그대로 하나의 애플리케이션 서버의 데이타모듈부분을 모든

    > > 클라이언트들이 공유해서 사용합니다. 이경운 전역변수문제라든지

    > > 프로시져가 동시에 작업이 들어갔을때 쓰레드 충돌같은 걸 염두해

    > > 두셔야 합니다. 안그러면 하루에도 수십번 따운 현상을 겪을실 겁니다.

    > > (제가 그랬었읍니다. ㅠㅠ)

    > >

    > > 싱글은 애플리케이션 서버와 클라이언트와 1:1로만 작업을 합니다.

    > > 결국 메모리가 많이 필요로 하겠죠..(BDE 메모리가 특히..)

    > > 님이 하시는 경우는 그냥 DCOM으로 하시는 것 같으신데 ..

    > > 만약 전역변수를 쓰시고 있다면 전역변수를 없애는 방향으로 잡으시고

    > > (특정한 값이 필요로 하시다면 테이블 하나 만드셔서 작업을 하시고)

    > > 특히 주의 해야할 것이 쓰레드 충동문제인데 이경운 프로시져 시작부분에

    > > Lock을 걸어주시고 끝나는 부분에 Lock을 해재시켜주시면 엉뚱한

    > > 충동은 안일어 날것입니다.

    > >

    > > 두번째 : "Insufficient memory for this operation"

    > > BDE에 INIT부분에 보시면 MEMSIZE와 SHAREDMEMSIZE부분의 용량을

    > > 조정해주시면 됩니다. 각 데이타베이스 컴포넌트 하나 붙으므로 해서

    > > 그만큼의 메모리가 필요로 하니까요..

    > > 계산법은 DELPHI5 CONTACT에 나와있습니다.

    > > 이 책은 하나 사셔서 두고 두고 보시는게 좋겠다는게 제 생각입니다.

    > > 그래서 자세한 계산법은 안