MongoDB C 운전자단일 스레드와 풀의 두 가지 연결 모드를 제공합니다. 특히 멀티스레드 애플리케이션의 경우 풀링 모드 사용하는 것이 좋습니다.
중요
다른 MongoDB 드라이버와 달리 C 운전자 연결 풀링 에 대한 CMAP 사양을 구현 하지 않습니다. C 운전자 의 컨텍스트에서 연결 풀링 데이터베이스 연결이 아닌 드라이버의 클라이언트 객체 캐시 나타냅니다.
풀링 모드
풀링 모드 사용하려면 mongoc_client_pool_t를 만듭니다.
mongoc_uri_t *uri = mongoc_uri_new("mongodb://hostA,hostB/?replicaSet=my_rs"); mongoc_client_pool_t *pool = mongoc_client_pool_new(uri);
mongoc_client_pool_pop을 처음 호출하면 풀이 배경 에서 모니터링 스레드를 시작합니다. 모니터링 스레드는 연결 URI의 모든 서버에 독립적으로 연결됩니다. 모니터링 스레드는 서버로부터 hello 응답을 받으면 서버 토폴로지 의 공유 보기를 업데이트 . 풀은 새 서버를 검색할 때 추가 모니터링 스레드와 연결을 생성합니다. 풀이 서버 토폴로지 의 공유 보기에서 서버를 제거하면 모니터링 스레드가 종료됩니다.
MongoDB 작업을 실행하는 각 스레드는 풀에서 클라이언트 를 체크아웃해야 합니다.
mongoc_client_t *client = mongoc_client_pool_pop(pool); /* use the client for operations ... */ mongoc_client_pool_push(pool, client);
개별 mongoc_client_t 객체는 스레드로부터 안전하지 않습니다.mongoc_client_pool_t 객체 만이 스레드 안전성을 제공합니다.
풀링 모드 에서는 모니터링 에서 사용 가능한 서버 발견하는 즉시 프로그램 작업이 차단 해제됩니다. 예시, 프로그램의 스레드가 프라이머리 에서 '삽입'을 실행하기 위해 대기하는 경우, 모든 세컨더리가 검사될 때까지 기다리는 대신 프라이머리 발견되는 즉시 차단을 해제합니다.
풀은 모니터링 위해 서버 당 하나의 연결을 엽니다. 각 클라이언트 애플리케이션 작업에 사용하는 각 서버 에 대한 자체 연결을 엽니다. 백그라운드 모니터링 10 스레드는 약 초마다 서버를 독립적으로 다시 스캔합니다.heartbeatFrequencyMS 연결 URI에 옵션을 지정하여 이 간격을 구성할 수 있습니다.( mongoc_uri_t 참조).
클라이언트 풀은 풀에 사용 가능한 클라이언트 객체 없고 maxPoolSize 제한에 아직 도달하지 않은 경우 새 mongoc_client_t 객체 생성합니다. 기본값 maxPoolSize 값은 100입니다.
연결 URI에 를 지정하여 waitQueueTimeoutMS mongoc_client_pool_pop이 풀에서 클라이언트 기다리는 시간을 제한할 수도 있습니다. (mongoc_uri_t 참조). 를 waitQueueTimeoutMS 지정하는 경우 풀이 실제로 클라이언트 반환하는지 확인합니다.
mongoc_client_t *client = mongoc_client_pool_pop(pool); if (client) { /* use the client for operations */ mongoc_client_pool_push(pool, client); } else { /* handle a wait queue timeout */ }
팁
에 대한 비차단 대안의 mongoc_client_pool_pop 경우 mongoc_client_pool_try_pop을 사용합니다.
풀 크기 및 동작을 구성하려면 연결 풀 옵션을 참조하세요. 풀링 모드 에서 운전자 사용하는 멀티스레드 프로그램의 확장된 예시 는 mongoc_client_pool_t를 참조하세요.
단일 스레드 모드
단일 스레드 모드 사용하려면 mongoc_client_t를 직접 생성합니다.
mongoc_client_t *client = mongoc_client_new( "mongodb://hostA,hostB/?replicaSet=my_rs");
클라이언트 MongoDB 작업에 처음 사용할 때 온디맨드 방식으로 연결됩니다. 서버 당 비블로킹 소켓을 사용하여 클라이언트 각 서버 에 대한 검사를 동시에 시작하고 비동기 poll 또는 select 함수를 사용하여 모두가 응답하거나 시간 초과될 때까지 소켓에서 이벤트를 수신합니다. 단일 스레드 모드 에서 C 드라이버 모든 검사를 동시에 시작하기 위해 팬아웃한 다음 모든 검사가 완료되거나 시간 초과되면 팬인합니다. 스캔이 완료되면 클라이언트 작업을 실행하고 반환됩니다.
단일 스레드 모드 에서 클라이언트 약 1분에 한 번씩 서버 토폴로지 다시 스캔합니다. 이전 스캔 이후 1분 이상이 경과하면 클라이언트 스캔을 완료하는 동안 클라이언트 의 다음 작업이 차단됩니다.heartbeatFrequencyMS 연결 URI에서 매개 변수를 사용하여 이 간격을 구성할 수 있습니다.( mongoc_uri_t 참조).
단일 스레드 클라이언트 토폴로지 에서 서버 하나의 연결을 엽니다. 이러한 연결은 토폴로지 스캔과 일반 작업 수행을 모두 처리하다 .
팁
연결 URI에 serverSelectionTryOne=false 옵션을 지정하여 MongoDB 에 대한 단일 스레드 클라이언트 객체 연결의 복원력을 개선할 수 있습니다.