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

C++빌더 Q&A
C++Builder Programming Q&A
[53840] Re:Re:Re:박지훈.임프님 감사 합니다. 헌데...
박지훈.임프 [cbuilder] 1599 읽음    2008-07-04 11:04
그런 메모리 에러가 난다면 그건 절대로 쿼리 내용상의 문제는 아닙니다.
만약 쿼리 내용에 따라 메모리 문제가 발생한다면 그건 SQL 서버의 버그라고 할 수 있겠지요?

데이터베이스 서버의 설정을 잘못했다든지, 프로그램에서 연결을 잘못 관리했다든지 등등 말입니다.

똑같은 메모리 문제는 아니지만, 힌트가 될 만한 한가지 예를 들어보죠.
예전에 저희 회사에 납품되었던 외부 개발 메일 발송 프로그램의 경우입니다. 잘 돌아가던 프로그램이 어느날 갑자기 에러를 수없이 뱉어내며 동작을 안하더군요. 이 프로그램은 SQL 서버 기반에, 실제 메일 발송 모듈은 콘솔 기반 C++로 되어 있었고 거기에 웹 UI를 위해 자바로 바깥쪽 개발을 한 프로그램이었습니다.

거의 반나절 동안 남이 만든 프로그램의 동작을 추적해본 결과, 이넘이 메일 발송을 하고 결과를 디비에 저장하기 위해 SQL 서버에 접속해서 인서트를 하고는, 디비 연결을 정상적으로 해제하지 않고 종료하고 있더군요. 그래서 실제로 사용되지도 않는 디비 연결이 계속 쌓여서 SQL서버쪽으로 연결이 아예 더 안되는 상황까지 간 거였습니다.

그런데 SQL 서버 등의 데이터베이스에는 기본적인 가비지 컬렉션과 비슷한 기능이 있어서, 끊어진 연결이 있더라도 일정 시간이 지나면 자동으로 해제합니다. 그래서 그 전까지는 프로그램 버그로 연결을 제대로 해제하지 않아도 SQL 서버가 정리를 해준 거였죠. 그런데 발송할 메일이 너무 많이 쌓인 상황에 이르자, SQL 서버가 끊어진 연결을 정리하는 속도보다 더 빠른 속도로 새로운 연결 시도들이 들어오고, 그래서 데이터베이스 내부의 연결 풀이 실제로 사용되지도 않는 연결들로 꽉 차버린 겁니다.

보리님이 겪으시는 문제도 아마 이런 종류의 문제일 가능성이 상당히 있다고 생각됩니다. SQL 내용에 문제가 있어서가 아니고요.

그럼...


보리 님이 쓰신 글 :
: 답변 정말 고맙습니다.

:
: 헌데, 제 프로그램에서 사용하는 쿼리문은 단 네개 입니다.
:
: Select, Insert, Update, Delete
:
: 뭐 기본적인건 다 있지만 위 네개의 명령을 수행하는 SQL문장이 각각 하나씩 있습니다.
:
: 저도 제 쿼리문에 문제가 있는게 아닐지 의심해서 이리저리 튜닝해 봤는데(워낙 기본적은 문장들이라 튜닝할 꺼리도 없지만), 시간이 지나면 결국 위와 같은 문제가 발생하는듯 합니다.
:
: 쿼리문장도 한번에 한 레코드씩 추가하거나 수정하는거라 트랜잭션 처리도 하지 않습니다.
:
: 결국 메모리 문제밖에 안남는데, 참 난감하군요...
:
: DB에 대해 잘 모르니 DB튜닝을 할수도 없고... 베개만한 SQL 책 붙잡고 또 연구해 봐야겠네요...
:
:
:
: 박지훈.임프 님이 쓰신 글 :
: : 메모리 부족이라면 이해가 안가신다고 하셨는데.. 이 에러는 메모리 부족 때문이 맞습니다.
: : 특히 SQL 서버가 32비트 환경에서 돌아가는 상황에서는 메모리 부족은 충분히 발생할 수 있습니다.
: :
: : SQL 서버의 메모리 관리가 비효율적인 탓도 있지만, 그보다는 지금까지 잘 사용하셨다는 소스에 문제가 있을 가능성이 아주 큽니다. 지금까지 잘 사용하셨다는 경험 때문에 기존의 소스코드에는 문제가 없다는 판단을 하시는 거겠지만... 기존 소스에 문제가 없어서 에러가 나지 않은 것이 아니라 문제가 있었는데도 그게 드러나지 않았을 뿐일 수 있습니다.
: :
: : 이런 문제는 소스와 설정 옵션 등을 전체적으로 리뷰를 해봐야 뭘 잘못했는지 알 수 있기 때문에, 바로 직접적인 문제가 뭐라고 답변을 드리기는 어렵겠네요. 하지만 일반적인 관점에서 의심을 먼저 해봐야 할 것은, 뭔가 할당을 하고는 해제를 안하는 경우입니다. (C++빌더로 작성한 로컬 프로그램에서의 문제와 비슷합니다)
: :
: : 그럼...
: :
: :
: : 보리 님이 쓰신 글 :
: : : 10여대의 PC가 연결해 사용중인 SQL Server가 있는데요...
: : :
: : : 툭하면 연결이 끊어지는 문제가 발생하고 있습니다. 한번 끊어지면 얼마간 연결도 안되고요... ㅠㅠ
: : :
: : : 서버쪽의 로그를 열어보면 다음과 같은 오류가 있던데요.
: : :
: : : "SQL Server에서 지금 LOCK 리소스를 가져올 수 없습니다. 활성 사용자가 적을때 문을 다시 실행하거나 시스템 관리자에게 SQL Server잠금과 메모리구성을 확인하도록 요청하십시오."
: : :
: : : 한 5년 잘 사용했고 데이터 유입량도 그리 많지 않습니다. 5년 사용했는데 데이터 량이 2기가가 안됩니다.
: : :
: : : 메모리나 사용자 라이선스가 모자르다는 내용이라면 솔직히 이해가 안갑니다.
: : :
: : : 매일 데이터와 트랜잭션 백업 작업을 합니다. (몇주일 트랜잭션 백업을 하지 않으면 서버가 꽉차더군요. <- 이게 문제인건지...)
: : :
: : : 뉘 오류가 어떤 의미인지 아시다면 도와 주셨으면 합니다.
: : :
: : : 가능하다면 간단한 처방이라도 알려 주시면 고맙겠습니다.

+ -

관련 글 리스트
53834 SQL Server 도와주세요...ㅠㅠ 보리 1137 2008/07/03
53836     Re:SQL Server 도와주세요...ㅠㅠ 박지훈.임프 1630 2008/07/04
53838         Re:Re:박지훈.임프님 감사 합니다. 헌데... 보리 1490 2008/07/04
53840             Re:Re:Re:박지훈.임프님 감사 합니다. 헌데... 박지훈.임프 1599 2008/07/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.