4

난 레일 애플 리케이션에서 독립적으로 실행되는 데몬에 ActiveRecord::ConnectionTimeoutError을 얻고있다. 저는 Apache와 MySQL이있는 Passenger를 데이터베이스로 사용하고 있습니다.현재 풀에있는 모든 데이터베이스 연결을 나열 할 수 있습니까?

여객의 기본 풀 크기는 6 개 (적어도 설명서에 나와있는 내용)이므로 6 개를 초과하는 연결을 사용해서는 안됩니다.

내 데몬이 하나의 연결 만 있으면된다고 생각했지만 ActiveRecord의 풀 크기를 10으로 설정했습니다. 내 데몬은 레일스 앱과 공유하는 데이터베이스에 물건을 저장하기 위해 여기 저기에 ActiveRecord을 호출하는 여러 스레드가있는 하나의 프로세스입니다.

알아 두어야 할 것은 스레드가 단순히 하나의 연결을 공유 할 수 없는지 또는 기존 연결을 해제하지 않고 새로운 연결을 계속 요청하는지 여부입니다. 풀 크기를 늘리고 문제를 연기 할 수는 있지만 데몬은 수 백 개의 스레드를 가질 수 있으며 머지 않아 풀의 연결이 끊어집니다.

내가 알고 싶은 첫 번째 사실은 승객이 실제로 6 개의 연결을 사용하고 있으며 문제가 데몬과 관련되어 있다는 것입니다. 어떻게 테스트합니까?

둘째, 모든 스레드가 자체 연결을 필요로하는지 또는 이미 연결되어있는 연결을 다시 사용하라는 메시지가 필요한지 파악하고 싶습니다. 그들이 자신의 연결이 필요하다면, 아마도 사용하지 않을 때 붙들지 말라고해야할까요? 쓰레드는 대부분 잠자고 있습니다.

답변

4

ActiveRecord가 사용하는 연결 풀은 ActiveRecord::Base.connection_handler.connection_pools을 통해 연결 풀 배열이어야합니다. 당신은 아마도 거기에 하나만있을 것이고 그것에는 connections 방법이 있습니다. 알고있는 연결 배열을 얻으려면.

또한 ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!)을 수행 할 수 있으며 더 이상 존재하지 않는 연결을 체크 아웃합니다. 이 도움이 또는 혼동하는 경우

모름 더

+0

내가 그러나 나는 당신이 당신의 데몬이 DB가 거부하여 연결을 제한 할 수 실행하는 방법을 모른다, 그것은 별도의 프로세스에서 실행되고 있기 때문에 자신을 가지고 있다고 생각합니다 당신의 데몬 연결 – ErsatzRyan

관련 문제