|
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
|