|
C++빌더 6이구요.. DB서버는 MYSQL입니다.
SQLConnection에서 Library Name=dbexpmysql.dll 을 쓰는군요.
TCP/IP소켓서버를 구현중인데
기존 처리방식은 클라이언트의 커넥션이 들어오면 개별 스레드가 실시간으로 MYSQL에 질의(Query)를 던지는 방식입니다.
근데 사용자가 뜸할때는 아무 문제가 없다가 사용자가 많이지기 시작하면 Lost connection 오류가 뜹니다.
이걸 해결하기 위해서 별의별 짓을 다 해봤는데.. 결국 찾아낸 원인은..
먼저 들어온 놈이 보낸 쿼리가 SQL서버에서 처리중일때 클라이언트의 다른 스레드에서 sql쿼리를 던지면 연결이 끊어지면서 오류가 나더군요.
이말은 한 DB커넥션에서 다중질의가 안된다는 얘긴데요..
도움말을 보니.. SQLConnection에 MaxStmtsPerConn(커넥션당 최대 동시에 처리할 수 있는 sql 쿼리 개수)이 있고 AutoClone(자가복제)이라는 프라퍼티가 있는데
결국 이건 멀티질의를 하려면 커넥션 자체를 자가복제해서 처리하는 방식이라는 소리잖아요. 곧 커넥션당 질의의 수는 결국 1:1...
근데 MaxStmtsPerConn의 값을 높혀주고 AutoClone=true해도 상황은 마찬가지네요. DBExpress를 잘 써보지않아서 어떤 해결책이 있는지 모르겠어요.
결국 해결한 대안은.. 실시간 클라이언트의 질의를 queue에 대기시켜서 하나씩 쿼리를 던져 처리하게 하는 방식을 썼습니다.
기존에 났던 에러 없이 잘 되네요. 근데 정말 많은 사용자가 동시에 폭주하면 대기열에 대기하는 스레드의 개수가 많아지고 해당 스레드의 질의가 처리되어 각 클라이언트에게 리턴값이 가는것도 시간이 많이 제체되어 time out이 걸릴 수도 있기 때문에.. 지금 당장은 임시방편은 되지만.. 영구적인 해결책은 못되는것 같습니다.
이와 같은 경험이 있으신 분..해결책이 없나요?
oracle이나 ms-sql만 쓰다가 mysql쓰려니 이런 문제가 발생하네요.
-로크오빠
|