한 번의 요청으로 여러 데이터베이스 연결을 만드는 것이 나쁜 습관 인 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/28590

문제

PHP 의 싱글 톤에 대한 토론은이 문제에 대해 점점 더 많이 생각하게합니다.대부분의 사람들은 한 번의 요청으로 많은 DB 연결을 만들지 말라고 지시하며 귀하의 추론이 무엇인지 궁금합니다.내 첫 번째 생각은 DB에 그렇게 많은 요청을하는 스크립트에 대한 비용이지만, 다음 질문에 스스로 반박합니다. 다중 연결이 동시 쿼리를 더 효율적으로 만들지 않을까요?

아는 사람들의 답변 (증거 포함)은 어떻습니까?

도움이 되었습니까?

해결책

데이터베이스 연결은 제한된 리소스입니다. 일부 DB는 연결 제한이 매우 낮고 연결 낭비가 큰 문제입니다. 많은 연결을 사용하면 다른 사용자가 데이터베이스를 사용하는 것을 차단할 수 있습니다.

또한 DB 서버에 유휴 상태 인 리소스가없는 한 DB에 추가 연결을 많이하는 것은 도움이되지 않습니다. 코어가 8 개이고 하나만 쿼리를 충족하는 데 사용되는 경우 다른 연결을 설정하는 것이 도움이 될 수 있습니다. 하지만 이미 사용 가능한 모든 코어를 사용하고있을 가능성이 높습니다. 또한 모든 DB 요청에 대해 동일한 하드 드라이브를 사용하고 추가 잠금 경합을 추가 할 수도 있습니다.

DB에 높은 사용률과 유사한 것이 있으면 추가 연결을 추가해도 도움이되지 않습니다. 그것은 추가 동시성이 처리를 더 빠르게 할 것이라는 맹목적인 희망으로 애플리케이션에서 추가 스레드를 생성하는 것과 같습니다. 특정 상황에서는 그럴 수도 있지만, 다른 경우에는 하드 드라이브를 쓰러 뜨리고 작업 전환에 시간을 낭비하고 동기화 오버 헤드를 유발하므로 속도가 느려집니다.

다른 팁

연결을 설정하고 데이터를 전송 한 다음 해체하는 비용입니다.당신의 성과를 앗아 갈 것입니다.

증거를 찾기가 더 어렵지만 다음 사항을 고려하십시오 ...

연결하는 데 x 마이크로 초가 걸린다고 가정 해 보겠습니다.

이제 여러 요청을하고 데이터를주고 받으려고합니다.하나의 연결과 여러 연결간에 전송 시간의 차이가 무시할 만하다고 가정 해 보겠습니다 (단지 논의를 위해).

이제 연결을 종료하는 데 y 마이크로 초가 걸린다고 가정 해 보겠습니다.

하나의 연결을 여는 데 x + y 마이크로 초의 오버 헤드가 걸립니다.많은 것을 여는 데는 n * (x + y)가 필요합니다.그러면 실행이 지연됩니다.

DB 연결 설정은 일반적으로 상당히 무겁습니다.백 스테이지에서 많은 일이 진행되고 있습니다 (DNS 해상도 / TCP 연결 / 핸드 셰이크 / 인증 / 실제 쿼리) .

모든 TCP 연결을 설정하는 데 몇 초가 걸리는 이상한 DNS 구성에 문제가 한 번있었습니다.내 로그인 절차 (복잡한 아키텍처로 인해)를 완료하려면 3 개의 서로 다른 DB 연결이 필요했습니다.그 문제로 인해 로그인하는 데 시간이 오래 걸렸습니다.그런 다음 하나의 연결 만 통과하도록 코드를 리팩터링했습니다.

우리는 .NET에서 Informix에 액세스하고 여러 연결을 사용합니다.각 연결에서 트랜잭션을 시작하지 않는 한 연결 풀에서 처리되는 경우가 많습니다.브랜드별로 매우 다르지만 대부분의 (?) 데이터베이스 시스템의 cilent 액세스는 최대한의 연결을 풀링합니다.

제외로, 데이터베이스 간 연결로 인해 연결 수에 문제가있었습니다.Informix는 동의어를 지원하므로 일반적인 위반자를 동의어로 지정하고 여러 연결을 서버 측에서 처리하여 전송 시간, 연결 생성 오버 헤드 및 (우리 상황의 실제 핵심) 라이선스 비용을 많이 절약했습니다.

요청이 비동기 적으로 전송되지 않기 때문이라고 생각합니다. 요청이 서버에서 반복적으로 수행되고 매번 차단되기 때문에 매번 연결을 생성하는 오버 헤드를 지불해야합니다.한 번만 ...

Flex에서는 모든 웹 서비스 호출이 자동으로 비동기식으로 호출되므로 여러 연결을 보거나 동일한 연결에서 요청을 대기열에 추가하는 것이 일반적입니다.

비동기식 요청은 더 빠른 요청 / 응답 시간을 통해 연결 비용을 완화합니다. 일부 스레딩 없이는 PHP에서 쉽게 이를 달성 할 수 없기 때문에 동일한 연결을 재사용하는 것보다 성능 저하가 더 큽니다..

그게 내 2 센트 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top