2011-01-12 1 views
4

mysql을 처음 사용하고 있는데 응용 프로그램과의 연결을 처리하는 방법에 대해 의심 스럽습니다.mysql connections. 각 트랜잭션 전에 활성 상태로 유지하거나 새 연결을 시작해야합니까?

지금 내가하고있는 일은 연결을 열고 내 프로그램을 종료 할 때까지 연결을 유지하는 것입니다. mysql_ping()을 매번 실행하면 MYSQL_OPT_RECONNECT로 연결이 시작된다.

다른 옵션 (내가 생각할 수있는)은 데이터베이스에 연결해야하는 작업을 수행하기 전에 새 연결을 시작한 다음 작업을 완료 한 후 닫는 것입니다.

이러한 두 가지 접근 방식의 장단점은 무엇입니까? 긴 연결의 "부작용"은 무엇입니까? 가장 많이 사용되는 방법은 무엇입니까?

건배)


일부 추가 세부 사항이 시점에서

나는 살아 연결을 유지하고 있고 지금은 이제 다시 모든 핑은 상태이고 필요한 경우 다시 연결합니다.

에도 불구하고 빠른 연속적으로 발생하는 쿼리와의 일관된 동시성이있을 때 "서버가 사라졌습니다."라는 메시지가 나타나고 잠시 후 연결이 다시 설정됩니다.

이것이 장기간 연결의 부작용인지 또는 이것이 잘못된 MySQL 서버 구성의 경우인지 궁금합니다.

아이디어가 있으십니까?

+0

"추가 세부 정보"를 보려면 해당 주제에 관한 기존 질문을 둘러 보거나 새로운 질문을 열어보십시오. –

답변

6

일반적으로 연결을 열 때 발생하는 상당한 양의 오버 헤드가 있습니다. 얼마나 자주이 일이 일어날 지 예상하고 있지만 괜찮을 수도 있지만 프로그램 실행 당 몇 가지 명령 이상을 실행하는 모든 종류의 응용 프로그램을 작성하는 경우 연결 유형 (서버 유형 응용 프로그램의 경우) 또는 독립 실행 형 응용 프로그램에서 최소한 한 번 또는 몇 번의 연결을 잠시 동안 열어두고 여러 번 트랜잭션에 다시 사용합니다.

이렇게하면 데이터베이스 서버가 관련되기 전에도 응용 프로그램 수준에서 열리는 연결 수를 더 효과적으로 제어 할 수 있습니다. 이것은 응용 프로그램 서버가 제공하는 서비스이지만, 작게 유지하려는 경우에는 쉽게 롤업 할 수 있습니다.

성능상의 이유로 인해 풀은 수요가 많은 피크에 대비하는 것이 좋습니다. 많은 요청이 들어오고 각각이 데이터베이스에 대한 별도의 연결을 열려고 할 때 - 또는 더 많은 (트랜잭션 당) 제안한 것처럼 - 자원이 고갈 될 것입니다.모든 연결은 MySQL 내부의 메모리를 소비 함을 명심하십시오!

루트가 아닌 사용자도 연결해야합니다. 그렇지 않은 경우 (MySQL SUPER 권한과 연결되어 있다고 생각하면) 사용자가 잠길 수 있습니다. MySQL은 관리자가 문제를 고칠 수 있도록 최소한 하나의 연결을 예약하지만, 앱이 해당 권한과 연결되면 화재를 수동으로 시도 할 때 모든 연결이 이미 사용되었습니다.

0

어떤 종류의 응용 프로그램을 쓰고 있습니까? 웹 스크립트 인 경우 공개 상태로 유지하십시오. 실행 파일 인 경우 연결을 풀 (필요한 경우 싱글 톤이 수행하는 대부분의 시간)합니다.

+0

실행 파일입니다. 연결을 풀링한다는 것은 무엇을 의미합니까? –

1

너무 많은 연결 (예 : 1,000 개 이상)이 걱정되는 경우가 아니면 연결을 유지 한 채로 있습니다. 연결/다시 연결에 오버 헤드가있어 작업 속도가 느려집니다. 당신이 잠시 동안 계속 열려있게하기 위해 연결이 필요거야 알고 있다면, 대신 주기적으로 핑의이 쿼리를 실행 : # 오픈 유휴 연결을 떠날 시간 (초)입니다

SET SESSION wait_timeout=# 

합니다.

+0

사실, 실제로 연결을 유지하기 위해 ping을 실행하고 있으며 기본 제한 시간도 있습니다. 나는 이것이 연결을 올바르게 유지하는 것을 커버한다고 생각하니? –

+0

예, wait_timeout을 설정하면 그 기간 동안 연결이 "활성"상태로 유지됩니다. 원할 경우 1 일 (86400)으로 설정할 수 있습니다. 그런 다음 하루에 한 번 핑 (ping)하면됩니다. 스크립트가 완료되면 연결이 닫히므로 연결이 열리지 않습니다. –