문서 메뉴

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

cursor.noCursorTimeout()

이 페이지의 내용

  • 정의
  • 행동
cursor.noCursorTimeout()

중요

Mongo쉬 방법

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

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

일정 시간 동안 활동이 없어도 커서가 자동으로 닫히지 않도록 서버에 지시합니다.

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

db.collection.find(<query>).noCursorTimeout()

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

세션이 30 분 이상 유휴 상태인 경우 MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 닫을 수 있습니다. MongoDB 서버가 세션을 닫으면 진행 중인 모든 작업과 세션과 관련된 열린 커서도 종료됩니다. 여기에는 noCursorTimeout() 또는 30 분보다 큰 maxTimeMS() 로 구성된 커서가 포함됩니다.

cursor.noCursorTimeout() 으로 db.collection.find() 를 발행하는 애플리케이션을 생각해 보세요. 서버는 find()cursor.batchSize() 로 정의된 문서 배치와 함께 커서를 반환합니다. 애플리케이션이 서버에서 새 문서 배치를 요청할 때마다 세션이 새로 고쳐집니다. 그러나 애플리케이션이 현재 문서 배치를 처리하는 데 30 분 이상 걸리면 세션이 만료로 표시되고 닫힙니다. 서버가 세션을 닫으면 커서도 noCursorTimeout() 로 구성되어 있음에도 불구하고 종료됩니다. 애플리케이션이 다음 문서 배치를 요청하면 서버는 오류를 반환합니다.

커서를 반환하는 작업의 경우 커서가 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.noCursorTimeout() 로 구성됩니다. while 루프에는 refreshSessions 를 사용하여 5 분마다 세션을 새로 고치는 차단이 포함되어 있습니다. 세션이 30 분의 유휴 시간 제한을 초과하지 않으므로 커서는 무기한 열린 상태로 유지될 수 있습니다.

MongoDB 드라이버의 경우 세션 생성에 대한 지침 및 구문은 드라이버 설명서 를 참조하세요.

← cursor.next()

이 페이지의 내용