문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

cursor.maxTimeMS()

이 페이지의 내용

  • 정의
  • 동작
  • 예제
cursor.maxTimeMS(<time limit>)

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드를 설명합니다. 이는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다 .

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

커서에서 작업을 처리하는 데 걸리는 누적 시간 제한을 밀리초 단위로 지정합니다.

maxTimeMS() 메서드의 프로토타입 형식은 다음과 같습니다.

db.collection.find(
{ <query> },
{ <projection> }
).maxTimeMS( <milliseconds> )

maxTimeMS() 메서드에는 다음과 같은 매개 변수가 있습니다.

매개변수
유형
설명
milliseconds
integer
커서에서 작업을 처리하는 데 걸리는 누적 시간 제한을 밀리초 단위로 지정합니다.

중요

maxTimeMS() 은(는) NoCursorTimeout 쿼리 플래그와 관련이 없습니다. maxTimeMS() 는 처리 시간과 관련이 있고, NoCursorTimeout 는 유휴 시간과 관련이 있습니다. 커서의 유휴 시간은 처리 시간에 영향을 주지 않습니다.

maxAwaitTimeMS() 메서드는 테일 커서가 다음 응답을 기다리는 시간에 대한 제한을 설정합니다. 총 처리 시간에는 제한을 설정하지 않습니다.

MongoDB는 연결된 커서가 할당된 시간 제한을 초과하는 경우 작업 종료를 목표로 합니다. MongoDB는 db.killOp()와 동일한 메커니즘을 사용하여 할당된 시간 제한을 초과하는 작업을 종료합니다. MongoDB는 지정된 중단 지점 중 하나에서만 작업을 종료합니다.

MongoDB는 클라이언트와 서버 간의 네트워크 지연 시간을 커서의 시간 제한에 포함하지 않습니다. 그러나 샤드 클러스터의 경우, MongoDB는 mongos 인스턴스와 mongod 인스턴스 사이의 지연 시간을 이 시간 제한에 포함합니다.

결과를 여러 배치로 생성하는 쿼리는 커서가 할당된 시간 제한을 초과할 때까지 계속해서 배치를 반환합니다.

MongoDB 드라이버와 mongosh 는 승인되지 않은 쓰기 작업을 제외한 모든 작업을 서버 세션 과 연결합니다. 세션과 명시적으로 연결되지 않은 작업(예: Mongo.startSession() 사용)의 경우, MongoDB 드라이버와 mongosh 는 암시적 세션을 생성하여 작업과 연결합니다.

세션이 30 분 이상 유휴 상태인 경우 MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 닫을 수 있습니다. MongoDB 서버가 세션을 닫으면 진행 중인 모든 작업과 세션과 관련된 열린 커서도 종료됩니다. 여기에는 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)
← cursor.maxAwaitTimeMS()

이 페이지의 내용