Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[9948] Re:Re:commit 시점을 어떻게 해야할 지...
윤명욱 [mwyun] 1049 읽음    2004-12-02 10:29
류종택 님이 쓰신 글 :
: IBTransaction.CommitRetaining; 을 사용하세요.
:
: 윤명욱 님이 쓰신 글 :
: : 지금 회사에서 firebird db를 활용하여 db 응용어플을 개발중입니다.
: :
: : ib 컴포넌트인 ibquery와 ibupdatesql를 활용하는데에요 레코드에 대한 추가,수정,삭제가 발생시
: :
: : 그때마다 commit하게 되면 자동으로 ibquery는 close돼서 다시 open해야되는 비율적인 처리를 하게 됩니다.
: :
: : 결국 cached update한 후에 나중에(언제가 될지는 모르지만... 특정 시점이됨) commit해서 한번에 db를 갱신해야하는데 좋은 방법이 있으면 조언 부탁드립니다.

답변 주신 류종택 님 감사드립니다. (_ _)


문제의 요지를 다시 짚어보면 다음과 같습니다.
특정 폼(윈도우)에서 입력이 끝나고 레코드가 추가,수정,삭제시 캐쉬 업데이트를 한 후에 차후에 한번에 DB에 적용하는게 성능상 이롭습니다.
특히 C/S가 분산되어 있고 Client가 여러개인 경우에 말입니다.


델파이에서는 쿼리한 검색 결과(client data set, record set등 다양한 용어가 있지만 같은 의미)를 변경할 수 있는 캐쉬 업데이트 기능을 지원해줍니다.
이런 캐쉬에 저장된 데이터를 DB에 적용하는 메소드들도 지원해주고 있죠
이에 대한 자세한 내용은 델파이 관련 서적이나 레퍼런스를 자세히 나와있습니다.


일단 환경적인 부분을 제가 자세히 얘기 않했나 봅니다. 지송 (_ _)
Client는 DB 서버에 하나의 connect만 유지합니다. 즉 Client는 한개 입니다.
또한 분산된 다른 컴퓨터의 DB 서버에 접속하는게 아니라 로컬 DB 서버에 접속하는 방식입니다.
등치있는 DB를 로컬 DB로 활용하고 있습니다. ^^;


어제 이 문제로 오후내내 자료 찾고 주의 사람들한테 물어보고 한 결과 다양한 의견이 나왔습니다.


첫째, 로컬 DB 서버인점과 Client가 하나만 접속하여 사용한다는 점을 고려하여(로컬 컴퓨터 및 단일 클라이언트의 이점) 데이터 변경시(추사,수정,삭제)
즉시 commit 시켜버립니다. 이때 단점은 오픈한 모든 client data set이 닫히므로 다시 오픈해줘야하므로 잦은 데이터 변경시 성능 저하를 초래할 수 있습니다.

둘째, 특정 폼(윈도우)에서 모든 입력을 맞힌 경우에 사용자가 commit 버튼을 클릭하도록 하여 commit 작업을 진행하도록 합니다.
즉 변경된 데이터(캐쉬 업데이트된 데이터)를 DB에 실제로 적용하는 겁니다.
이때 단점은 사용자의 PC가 정전이나 오류로 인해서 다운되었을 때 데이터가 날아갈 수 있다는 것입니다.
그런 예기치 못한 상황을 대비하여 캐쉬 파일로 만들어주는 기능도 지원하지만 프로그램이 복잡해질 수 있습니다.


셋째, client data set이 변경되었으면 DB에 실제로 적용하고 다시 오픈하여 data set을 가져오지 않고 client data set을 그대로 활용하는 방법입니다.
결국 client data set과 DB의 데이터를 동일하게 유지하는 것입니다.
DB에는 캐쉬 업데이트된 데이터들이 적용되는 것이며 다시 쿼리를 요청하여 data set를 가져올 필요가 없으면 필요하다면 다시 가져와도 상관없습니다.
역쉬 매뉴얼을 잘읽어봐야해... ㅠ_ㅠ


기타 서버프로그래밍 하시는 분들도 저런 비슷한 고민 하셨을꺼 같은데 답글이 없더군요 ㅠ_ㅠ
그래서 다양한 의견을 못들어봤습니다. 왜냐면 DB 서버 입자에서 보면 서버프로그램도 Client가 되기 때문에 서버프로그램이 어떤 시점에서 데이터를 변경시킬려고 하는지
그 처리 방안에 대해서 궁금했었습니다. 일단은 서버프로그램이나 DB 응용 프로그램이던지간에 프로그램 성격에 따라 다르게 적용하는게 났지 않냐는 의견도 있었습니다.
(상황에 따라 적절히 대처하자!)


결론은 아무 생각없이 트랜잭션 처리하는 루틴 만들어둬서 적용한게 첫번째 방법인데요 세번째 방법으로 바꾸어서 테스트를 해본 결과 잘동작합니다.
개발툴이나 DB에서 지원하는 기능들을 매뉴얼 잘읽어보고 테스트해봐야겠습니다.

+ -

관련 글 리스트
9942 commit 시점을 어떻게 해야할 지... 윤명욱 1414 2004/12/01
9947     Re:commit 시점을 어떻게 해야할 지... 류종택 1177 2004/12/01
9948         Re:Re:commit 시점을 어떻게 해야할 지... 윤명욱 1049 2004/12/02
9949             Re:Re:Re:commit 시점을 어떻게 해야할 지... 류종택 1094 2004/12/02
9953                 Re:Re:Re:Re:commit 시점을 어떻게 해야할 지... 윤명욱 1156 2004/12/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.