|
혹시 안영제 부장님이신가요? 안녕하세요. 인사가 늦었습니다.
저 누군지 알아보시겠어요? 작년에 여의도 한국증권 리뉴얼 프로젝트 함께 진행했었던
송득보 과장입니다. 닉네임을 바꾸셔갖고 최근에 활동하는건 몰라뵈었네요.
예전에는 "civilian, 안영제" 쓰셨잖아요. 부장님..많은 지도편달 부탁드리겠습니다. ^^;
-locke, 송득보
civilian 님이 쓰신 글 :
: MySQL이 Thread-Safe 하지 않아서 발생하는 문제입니다.
:
: locke 님이 쓰신 글 :
: : db서버는 리눅스에서 mysql을 쓰구요. (버전은 모르겠음)
: :
: : 소켓서버(windows환경)는 클라이언트의 요청에 따라 mysql서버에 쿼리를 처리하여 결과값을 클라이언트에게 돌려주는 기능을 합니다.
: :
: : c++빌더 6상에서 TSQLConnection을 사용하여 db에 접속하여 쿼리를 가져오는데요.
: :
: : 동시접속 테스트를 하느라 동시에 100~500개의 커넥션을 소켓서버에 일괄로 연결해서
: :
: : 테스트를 하고있는데 -이전에도 비슷한 글을 올렸습니다만-
: :
: : 문제가 이거거든요. 서버쪽에 TSQLQuery::Open() 명령어를 통해서 어떤 쿼리를 동작중일때
: :
: : 다른 클라이언트 커넥션 스레드에서 쿼리를 동시에 서버로 날리면 db쪽에서 에러가 납니다. 결과적으로는 Access Violation이 나오는데
: :
: : 혹시나 싶어서 TCriticalSection을 사용하여 하나의 쿼리작업이 끝날때까지 다른 스레드가 대기하도록 처리하면
: :
: : 아무 에러가 없습니다. 물론 서버에 접속한 클라이언트 커넥션은 한 SQLConnection에 물려서 db를 처리하구요.
: :
: : 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
|