cursor.maxTimeMS()
정의
cursor.maxTimeMS(<time limit>)
중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드를 설명합니다. 이는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
커서에서 작업을 처리하는 데 걸리는 누적 시간 제한을 밀리초 단위로 지정합니다.
maxTimeMS()
메서드의 프로토타입 형식은 다음과 같습니다.db.collection.find( { <query> }, { <projection> } ).maxTimeMS( <milliseconds> ) maxTimeMS()
메서드에는 다음과 같은 매개변수가 있습니다.Parameter유형설명milliseconds
integer
커서에서 작업을 처리하는 데 걸리는 누적 시간 제한을 밀리초 단위로 지정합니다.
중요
maxTimeMS()
는 NoCursorTimeout
쿼리 플래그와 관련이 없습니다. maxTimeMS()
는 처리 시간과 관련이 있고, NoCursorTimeout
은 유휴 시간과 관련이 있습니다. 커서의 유휴 시간은 처리 시간에 영향을 주지 않습니다.
maxAwaitTimeMS()
메서드는 테일 커서(tailable cursor)가 다음 응답을 기다리는 시간에 대한 제한을 설정합니다. 총 처리 시간에는 제한을 설정하지 않습니다.
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
동작
MongoDB는 연결된 커서가 할당된 시간 제한을 초과하는 경우 작업 종료를 목표로 합니다. MongoDB는 db.killOp()
와 동일한 메커니즘을 사용하여 할당된 시간 제한을 초과하는 작업을 종료합니다. MongoDB는 지정된 중단 지점 중 하나에서만 작업을 종료합니다.
MongoDB는 클라이언트와 서버 간의 네트워크 지연 시간을 커서의 시간 제한에 포함하지 않습니다. 그러나 샤딩된 클러스터의 경우, MongoDB는 mongos
인스턴스와 mongod
인스턴스 사이의 지연 시간을 이 시간 제한에 포함합니다.
결과를 여러 배치로 생성하는 쿼리는 커서가 할당된 시간 제한을 초과할 때까지 계속해서 배치를 반환합니다.
세션 유휴 시간 제한 재정의 maxTimeMS
MongoDB 드라이버와 mongosh
는 승인되지 않은 쓰기 작업을 제외한 모든 작업을 서버 세션과 연결합니다. 세션과 명시적으로 연결되지 않은 작업(예: Mongo.startSession()
사용)의 경우, MongoDB 드라이버와 mongosh
는 암시적 세션을 생성하고 이를 작업과 연결합니다.
세션이 30분 이상 유휴 상태인 경우, MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 종료할 수 있습니다. MongoDB Server가 세션을 종료하면 진행 중인 모든 작업과 해당 세션과 관련된 열린 커서도 종료됩니다. 여기에는 noCursorTimeout()
또는 30분보다 큰 maxTimeMS()
로 구성된 커서가 포함됩니다.
예를 들어 maxTimeMS()
가 31분의 시간 제한으로 구성된 find()
작업이 있다고 가정해 보겠습니다. 서버는 find()
의 cursor.batchSize()
로 정의된 문서 배치와 함께 커서를 반환합니다. 애플리케이션이 서버에서 새로운 문서 배치를 요청할 때마다 세션이 새로 고쳐집니다. 그러나 애플리케이션이 현재 문서 배치를 처리하는 데 30분 이상 소요되면 세션이 만료되고 닫힌 것으로 표시됩니다. 서버가 세션을 닫으면 커서도 30분 이상의 maxTimeMS()
로 구성되어 있음에도 불구하고 종료됩니다. 애플리케이션이 다음 문서 배치를 요청하면 서버는 오류를 반환합니다.
커서를 반환하는 작업의 경우 커서가 30분 이상 유휴 상태일 수 있는 경우 Mongo.startSession()
를 사용하여 명시적 세션 내에서 작업을 실행하고 refreshSessions
명령을 사용하여 세션을 주기적으로 새로 고칩니다. 예시:
var session = db.getMongo().startSession() var sessionId = session sessionId // show the sessionId var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout() var refreshTimestamp = new Date() // take note of time at operation start while (cursor.hasNext()) { // Check if more than 5 minutes have passed since the last refresh if ( (new Date()-refreshTimestamp)/1000 > 300 ) { print("refreshing session") db.adminCommand({"refreshSessions" : [sessionId]}) refreshTimestamp = new Date() } // process cursor normally }
예시 작업에서 db.collection.find()
메서드는 명시적 세션과 연결됩니다. cursor.maxTimeMS()
로 커서를 구성하여 커서를 최소 31분 동안 열어 두도록 합니다. while
루프에는 refreshSessions
을 사용하여 5분마다 세션을 새로 고치는 차단이 포함되어 있습니다. 세션이 30분의 유휴 시간 제한을 초과하지 않으므로 커서는 구성된 maxTimeMS()
까지 열려 있는 상태로 유지될 수 있습니다.
MongoDB 드라이버의 경우, 세션 생성에 대한 지침과 구문은 드라이버 설명서를 참조하세요.
예시
예시
다음 쿼리는 시간 제한을 50밀리초로 지정합니다.
db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)