2010-03-11 3 views
1
  1. 각 Apache 스레드마다 데이터베이스 커서를 한 번 초기화해야합니까? 아니면 HTTP 클라이언트가 사용할 수있는 모든 기능에서 초기화해야합니까?웹 응용 프로그램 : DB 커서를 유지하거나 다시 만드시겠습니까?

  2. 클라이언트가 연결을 종료하면 (즉, 사용자가 브라우저 탭을 닫을 때) 어떻게됩니까? 요청을 처리하는 서버 측 함수가 반환 될 때까지 정상적으로 계속 수행됩니까? 아니면 모든 트랜잭션을 닫지 않고 즉시 종료됩니까?

답변

0

커서는 값 비싼 리소스입니다. 일반적으로

... 당신이 그들을 필요로 할 때
  1. 단지를 엽니 다.

  2. 작업을 마친 후 즉시 닫으십시오.

스레드 당 커서가 불필요하게 리소스를 묶을 수 있습니다. 때로는 커서 당 스레드가 더 높은 성능을 발휘할 수있는 많은 데이터베이스 활동이 있습니다. 이것은 드물다. 커서가 닫힌 상태에서 닫히는 것이 느려지는 경우 실제 작업을 확인하기 위해 함수 단위와 스레드 단위의 차이를 측정해야합니다.

서버는 브라우저에서 무슨 일이 일어나는지 알지 못합니다. 제로. 브라우저의 각 요청은 별도의 고유 한 연결이 끊긴 이벤트입니다.

브라우저가 닫히면 아무런 의미가 없습니다. 서버가 더 이상의 요청을 얻지 못한다는 것을 의미합니다.

서버가 응답을 다운로드하려고 시도하면 소켓이 충돌하고 결국 서버가 중지됩니다.

서버가 아무 것도 처리하지 않으면 여전히 처리되지 않습니다. 나는 데이터베이스 연결 또는 커서와 같은 자원을 초기화하는 생각

0
  1. 스레드 당 OK입니다. 일부 프레임 워크/라이브러리는 스레드 로컬 "전역"변수를 사용합니다. 데이터베이스 최대 클라이언트 연결 제한을 알고 있어야합니다. db 연결을 계속 열어 둘지 또는 각 요청에 대해 db에 연결하는 데 얼마의 시간을 할애할지 여부는 결정에 달려 있습니다. 또한 데이터베이스 서버에 따라 각 연결에 필요한 리소스의 양이 결정됩니다. AFAIK PostgreSQL은 연결에 새로운 프로세스를 포크 (MySQL은 스레드를 사용하는 반면)하지만 포크를 사용합니다.

  2. 앱을 실행하는 웹 서버에 따라 다릅니다. 누군가가 브라우저 탭을 닫으면 소켓에 HTTP 응답을 쓰고 싶을 때 알 수 있습니다. 쓰기 오류가 발생해야합니다. 하지만 클라이언트에서 닫힌 연결을 감지 할 때 프로세스/스레드를 종료하도록 구성된 웹 서버를 상상할 수 있습니다. 그러나 웹 앱이 정전 (정전)이나 강제 (웹) 서버가 즉시 다시 시작되는 것과 같은 상황이 여전히 있습니다.

  3. 작은 힌트 - 마지막 요청을 처리 할 때 예외가 발생하고 연결이 제대로 롤백되지 않은 경우를 대비하여 HTTP 요청을 처리하기 전에 트랜잭션을 확인하고 롤백해야합니다. (또는 HTTP 요청을 처리 한 후에이 작업을 수행 할 수 있습니다.) HTTP 요청을 처리하기 전에 db 연결이 아직 활성 상태인지 확인하십시오 (시간 초과 될 수 있음).

관련 문제