문제

데이터베이스가 연결을 시작한 엔티티가 명시 적으로 닫지 않은 연결을 어떻게 처리하는지 알고 싶습니다.

  1. 한 번에 2 개의 동시 연결 만 수락 할 수있는 데이터베이스가 있다고 가정 해 봅시다. 연결을 열고 닫지 않는 코드가 있습니다. 이 코드는 영원히 실행되지만 수명은 한 번만 연결을 사용하지만 연결 객체는 범위를 벗어나지 않으므로 수집되지 않습니다. 이 코드의 2 인스턴스를 실행한다고 가정 해 봅시다. 프로그램이 종료되거나 연결 시간이 끝날 때까지 (비 활동으로 인해) 데이터베이스가 더 이상 연결을 수락 할 수 없다는 것을 의미합니까?

  2. 위의 시나리오에서 연결 객체가 수집 된 경우 연결이 자동으로 종료되었거나 사용중인 데이터베이스 드라이버에 따라 연결되어 있거나 연결이 명시 적으로 닫을 때까지 전혀 종료되지 않습니까?

  3. 코드 조각으로 연결을 열고 연결을 명시 적으로 닫지 않으면 프로그램이 종료되는 경우 데이터베이스가 해당 연결을 어떻게 되 찾는가?

도움이 되었습니까?

해결책

데이터베이스 연결을위한 기본 프로토콜은 일반적으로 TCP/IP 기반입니다. 연결은 여러 가지 방법 중 하나로 종료 될 수 있습니다.

  1. 서버는 우아하게 닫히고 클라이언트로부터 승인을받습니다.
  2. 클라이언트는 닫는 것이 우아하게이며 서버로부터 승인을받습니다.
  3. 연결이 시작됩니다. 클라이언트와 서버는 각각의 운영 체제에 의해 연결이 닫혔다 고 말합니다.
  4. 연결은 어느 쪽이든 강제로 닫힙니다.

(3)의 경우 타임 아웃을 피하기 위해 더미 메시지를 자주 보내면 TCP 연결을 살아남아야합니다. 어느 쪽 도이 작업을 수행하지 않기 때문에 연결 시간 초과가 발생할 수 있습니다 (데이터베이스 연결의 경우 일반적으로 원하는 것이 아닙니다).

한쪽이 연결이 닫히고 다른 쪽이 여전히 열려 있다고 생각하는 시간이 전적으로 가능합니다. 해당 경우에 메시지가 전송 될 수 있습니다 (일반적으로 폐기).

각 연결 ( "소켓")은 파일 설명자 (Unix Parlance에서는 OS가 다른 것을 호출 할 수 있습니다)는 I/O 리소스의 핸들이며 열린 파일에 사용되는 것과 동일한 것 (다시 OSS가 다를 수 있음)입니다.

데이터베이스의 연결 제한은 다음 중 가장 낮습니다.

  • OS의 구성된 한계;
  • 최대 파일 설명자는 해당 프로세스를 허용했습니다 (I/O 활동에 사용되는 모든 것을 제외). 그리고
  • (아마도) 연결 제한에 대한 시스템 설정 또는 정책.

연결이 TCP 기반이 아닌 경우 (예 : UNIX 시스템의 MySQL과 함께 자주 사용되는 파일 시스템 소켓) 원칙은 실제로 매우 simlar입니다.

어쨌든, 이것에서 가져올 이야기의 도덕은 그 형태에 관계없이 데이터베이스 연결이 어떤 종류의 운영 체제 자원을 제공한다는 것입니다. 귀하의 프로그램 HSA는 해당 리소스를 직간접 적으로 요청했습니다. 프로그램이 죽으면 운영 체제가이를 되 찾을 것입니다 (아마도 즉시가 아니라 결국). 연결이 쓰레기를 수집하면 자원이 강제 폐쇄 된 것과 거의 같은 방식으로 릴리스됩니다.

연결을 열고 한도를 구동하는 외부 리소스 (클라이언트가 사용중인 코드가 아님).

다른 팁

순서대로 질문에 답변하려면 :

  1. 예, 아마도. "동시 연결"이 아니라면 실제로 "동시 쿼리"를 의미합니다. 데이터베이스 연결을 열어두면 열려 있습니다.

  2. 쓰레기 수집은 연결을 정리하거나 정리하지 않을 수도 있습니다. 언어와 사용 된 데이터베이스 드라이버에 따라 다릅니다. (쓰레기 수집은 TCP 연결과 같은 리소스가 아니라 메모리를 되 찾는 것으로 제한 될 수 있습니다.)

  3. 프로그램이 종료되면 일반적으로 OS는 사용 된 모든 리소스를 정리할 책임이 있습니다. 여기에는 TCP 닫기 등이 포함됩니다. 연결. 따라서 대부분의 연결 유형의 경우 데이터베이스에 다른 측면이 연결을 닫았다는 알림을받습니다.

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