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
[58329] MySQL, TSQLConnection 질문
locke [syiware] 1822 읽음    2009-09-02 11:35
db서버는 리눅스에서 mysql을 쓰구요. (버전은 모르겠음)

소켓서버(windows환경)는 클라이언트의 요청에 따라 mysql서버에 쿼리를 처리하여 결과값을 클라이언트에게 돌려주는 기능을 합니다.

c++빌더 6상에서 TSQLConnection을 사용하여 db에 접속하여 쿼리를 가져오는데요.

동시접속 테스트를 하느라 동시에 100~500개의 커넥션을 소켓서버에 일괄로 연결해서

테스트를 하고있는데 -이전에도 비슷한 글을 올렸습니다만-

문제가 이거거든요. 서버쪽에 TSQLQuery::Open() 명령어를 통해서 어떤 쿼리를 동작중일때

다른 클라이언트 커넥션 스레드에서 쿼리를 동시에 서버로 날리면 db쪽에서 에러가 납니다. 결과적으로는 Access Violation이 나오는데

혹시나 싶어서 TCriticalSection을 사용하여 하나의 쿼리작업이 끝날때까지 다른 스레드가 대기하도록 처리하면

아무 에러가 없습니다. 물론 서버에 접속한 클라이언트 커넥션은 한 SQLConnection에 물려서 db를 처리하구요.(소켓서버는 한개의 SQLConnection으로 1:1 mysql에 물려있습니다)

TSQLQuery는 각 커넥션이 소켓에 들어오면 쿼리를 할 때만 동적으로 그때그때 생성해서 SQLConnection에 작업을 수행하므로 각각의 스레드가 sqlquery의 공유위반으로 access violation이 걸릴 이유는 없습니다.

혹시나 싶어서 SQLConnection을 복수개의 커넥션 풀(10개 이상의 db커넥션을 미리 만들어놓음)을 만들어서 분배해줘도 동일한 오류가 납니다. CriticalSection을 쓰면 오류는 안나는데..이렇게 되면 복수개의 커넥션 풀을 만들어도 한 쿼리가 끝날때까지 다른 애들은 기다려야되니까 DB Connection 풀링의 의미가 없어집니다.

이게 mysql이라 그런건지.. 아니면 c++빌더의 sqlconnection의 성능결함인지를 모르겠어요.

예전에 oracle이나 mssql을 쓸때는 이런 문제가 없었거든요.

혹시 mysql이나 tsqlconnection을 즐겨 쓰시는 분중에 해답을 알고계신 분 계시면 좀 설명좀 해주세요.

c빌더상에서 mysql을 접속하는 db컴포넌트를 바꿔야 되는건지..아니면 db자체를 mysql에서 oracle이나 mssql로 바꿔야되는지요..

-locke

+ -

관련 글 리스트
58329 MySQL, TSQLConnection 질문 locke 1822 2009/09/02
58330     Re:MySQL, TSQLConnection 질문 civilian 1353 2009/09/02
58723         Re:Re:MySQL, TSQLConnection 질문 locke 1121 2009/10/07
58724             Re:Re:Re:MySQL, TSQLConnection 질문 civilian 1307 2009/10/07
58332         Re:Re:MySQL, TSQLConnection 질문 locke 1238 2009/09/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.