mysqli 확장 및 영구 연결

영구 연결의 이면에 있는 아이디어는 클라이언트 프로세스와 데이터베이스 간의 연결이 여러 번 생성 및 소멸되는 대신 클라이언트 프로세스에서 재사용할 수 있다는 것입니다. 이렇게 하면 사용하지 않은 연결이 캐시되어 재사용할 준비가 되므로 필요할 때마다 새로운 연결을 생성하는 오버헤드가 줄어듭니다.

mysql 확장과 달리 mysqli는 영구 연결을 여는 별도의 기능을 제공하지 않습니다. 영구 연결을 열려면 연결할 때 호스트 이름 앞에 p:를 추가해야 합니다.

영구 연결의 문제는 클라이언트가 연결을 예측할 수 없는 상태로 둘 수 있다는 것입니다. 예를 들어, 클라이언트가 예기치 않게 종료되기 전에 테이블 잠금이 활성화될 수 있습니다. 이 영구 연결을 재사용하는 새 클라이언트 프로세스는 as is 연결을 가져옵니다. 새 클라이언트 프로세스가 영구 연결을 제대로 사용하기 전에 정리를 완료해야 프로그래머의 부담이 커집니다.

그러나 mysqli 확장의 지속적인 연결은 내장된 정리 처리 코드를 제공합니다. mysqli가 수행하는 정리에는 다음이 포함됩니다.

  • 활성 트랜잭션 롤백
  • 임시 테이블 닫기 및 삭제
  • 테이블 잠금 해제
  • 세션 변수 재설정
  • 준비된 문 닫기(항상 PHP에서 발생)
  • 핸들러 닫기
  • GET_LOCK()으로 획득한 잠금 해제

이렇게 하면 클라이언트 프로세스가 연결을 사용하기 전에 연결 풀에서 반환될 때 영구 연결이 깨끗한 상태가 됩니다.

mysqli 확장은 C-API 함수 mysql_change_user()를 자동으로 호출하여 이 정리를 수행합니다.

자동 정리 기능에는 장점과 단점이 있습니다. 이점은 프로그래머가 자동으로 호출되기 때문에 정리 코드를 추가하는 것에 대해 더 이상 걱정할 필요가 없다는 것입니다. 그러나 단점은 연결 풀에서 연결이 반환될 때마다 정리를 수행하는 코드를 실행해야 하므로 코드가 잠재적으로 약간 느려질 수 있다는 것입니다.

MYSQLI_NO_CHANGE_USER_ON_PCONNECT가 정의된 PHP를 컴파일하여 자동 정리 코드를 끌 수 있습니다.

메모: mysqli 확장은 MySQL 네이티브 드라이버 또는 MySQL 클라이언트 라이브러리를 사용할 때 영구 연결을 지원합니다.