cursor.noCursorTimeout()
정의
cursor.noCursorTimeout()
중요
Mongo쉬 방법
이는
mongosh
메서드입니다. 이는Node.js
또는 기타 프로그래밍 언어별 드라이버 메서드에 대한 설명서가 아닙니다 .대부분의 경우
mongosh
메서드는 레거시mongo
shell 메서드와 동일한 방식으로 작동합니다. 그러나 일부 레거시 메서드는mongosh
에서 사용할 수 없습니다.레거시
mongo
셸 문서는 해당 MongoDB 서버 릴리스 문서를 참조하세요.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 문서를 참조하세요.
일정 시간 동안 활동이 없어도 커서가 자동으로 닫히지 않도록 서버에 지시합니다.
noCursorTimeout()
메서드의 프로토타입 형식은 다음과 같습니다.db.collection.find(<query>).noCursorTimeout()
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
중요
이 명령은 M0, M2 및 M5 클러스터에서 지원되지 않습니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
행동
세션 유휴 시간 제한 재정의 noCursorTimeout
MongoDB 드라이버와 mongosh
는 승인되지 않은 쓰기 작업을 제외한 모든 작업을 서버 세션과 연결합니다. 세션과 명시적으로 연결되지 않은 작업(예: Mongo.startSession()
사용)의 경우, MongoDB 드라이버와 mongosh
는 암시적 세션을 생성하고 이를 작업과 연결합니다.
세션이 30분 이상 유휴 상태인 경우, MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 종료할 수 있습니다. MongoDB Server가 세션을 종료하면 진행 중인 모든 작업과 해당 세션과 관련된 열린 커서도 종료됩니다. 여기에는 30분 이상의noCursorTimeout()
또는 maxTimeMS()
로 구성된 커서가 포함됩니다.
cursor.noCursorTimeout()
으로 db.collection.find()
를 발행하는 애플리케이션을 생각해 보세요. 서버는 find()
의 cursor.batchSize()
로 정의된 문서 일괄 처리와 함께 커서를 반환합니다. 애플리케이션이 서버에서 새로운 문서 배치를 요청할 때마다 세션이 새로 고침됩니다. 그러나 애플리케이션이 현재 문서 배치를 처리하는 데 30분 이상 소요되면 세션이 만료되고 닫힌 것으로 표시됩니다. 서버가 세션을 닫으면 커서도 noCursorTimeout()
으로 구성되어 있음에도 불구하고 종료됩니다. 애플리케이션이 다음 문서 배치를 요청하면 서버는 오류를 반환합니다.
커서 새로 고침 refreshSessions
커서를 반환하는 작업의 경우 커서가 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
루프에는 5분마다 세션을 새로 고치기 위해 refreshSessions
를 사용하는 블록이 포함되어 있습니다. 세션이 30분의 유휴 시간 제한을 초과하지 않으므로 커서는 무기한 열린 상태로 유지될 수 있습니다.
MongoDB 드라이버의 경우, 세션 생성에 대한 지침과 구문은 드라이버 설명서를 참조하세요.