MongoDB Server 실행 시간 제한
개요
Java 운전자 사용하여 서버 작업을 수행할 때 서버 작업을 완료할 수 있는 시간을 제한할 수도 있습니다. 이렇게 하려면 클라이언트 사이드 작업 시간 제한(CSOT)을 지정합니다. 제한 시간은 서버 선택, 연결 체크아웃 및 서버 측 실행을 포함하여 작업을 완료하는 데 필요한 모든 단계에 적용됩니다. 시간 초과가 만료되면 Java 운전자 시간 초과 예외를 발생시킵니다.
참고
실험적 기능
CSOT 기능 실험적 기능이며 향후 드라이버 릴리스 에서 변경될 수 있습니다.
timeoutMS 옵션
MongoDB deployment 에 연결할 때 제한 시간을 지정하려면 timeoutMS
연결 옵션을 제한 시간 길이(밀리초)로 설정하다 . 다음과 같은 방법으로 timeoutMS
옵션을 설정하다 수 있습니다.
MongoClientSettings.Builder
클래스에서timeout()
메서드 호출연결 string에서
timeoutMS
매개변수 설정
다음 코드 예제에서는 클라이언트 수준 시간 제한을 200
밀리초로 설정하다 . MongoClientSettings 또는 Connection
String 탭 선택하여 해당 코드를 확인합니다.
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build(); MongoClient mongoClient = MongoClients.create(settings);
String uri = "<connection string>/?timeoutMS=200"; MongoClient mongoClient = MongoClients.create(uri);
허용되는 시간 초과 값
다음 표에서는 timeoutMS
에 허용되는 값에 해당하는 시간 초과 동작을 설명합니다.
값 | 행동 |
---|---|
양의 정수 | 작업 완료에 사용할 시간 제한을 설정합니다. |
| 작업이 시간 초과되지 않도록 지정합니다. |
| Defers the timeout behavior to the following settings: These settings are deprecated and are ignored if you set timeoutMS . |
timeoutMS
옵션을 지정하면 운전자 각 서버 작업에 지정된 시간 제한을 자동으로 적용합니다. 다음 코드 예시 클라이언트 수준에서 200
밀리초의 시간 제한을 지정한 다음 MongoCollection.insertOne()
메서드를 호출합니다.
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build(); try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("db"); MongoCollection<Document> collection = database.getCollection("people"); collection.insertOne(new Document("name", "Francine Loews")); }
시간 초과 상속
timeoutMS
옵션을 지정하면 운전자 다른 Java 운전자 옵션과 동일한 상속 동작에 따라 시간 초과를 적용합니다. 다음 표에서는 각 수준에서 시간 초과 값이 상속되는 방식에 대해 설명합니다.
수준 | 상속 설명 |
---|---|
작업 | 가장 높은 우선 순위를 가지며 다른 수준에서 설정하다 시간 초과 옵션을 재정의합니다. |
트랜잭션 | 세션, 컬렉션, 데이터베이스 또는 클라이언트 수준에서 설정하다 시간 초과 값보다 우선합니다. |
Session | 해당 수준에서 다른 시간 초과 값을 설정하다 하지 않는 한 해당 세션 내의 모든 트랜잭션 및 작업에 적용됩니다. |
Database | 해당 수준에서 다른 시간 초과 값을 설정하다 하지 않는 한 해당 데이터베이스 내의 모든 세션 및 작업에 적용됩니다. |
컬렉션 | 해당 수준에서 다른 시간 초과 값을 설정하다 하지 않는 한 해당 컬렉션 의 모든 세션 및 작업에 적용됩니다. |
고객 |
|
재정의 및 특정 옵션에 대한 자세한 내용은 다음 재정의 섹션을 참조하세요.
재정의
Java 운전자 데이터베이스 작업의 동작과 성능을 제어하기 위해 다양한 수준의 구성을 지원합니다.
보다 구체적인 수준에서 timeoutMS
옵션을 지정하여 클라이언트 수준 구성을 재정의할 수 있습니다. 이전 섹션의 표에서는 시간 초과 설정을 지정할 수 있는 수준에 대해 설명합니다. 이를 통해 개별 작업의 요구 사항에 따라 시간 초과를 사용자 지정할 수 있습니다.
다음 예시 컬렉션 수준 시간 초과 구성이 클라이언트 수준 시간 초과 구성을 재정의할 수 있는 방법을 보여 줍니다.
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build(); try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("db"); MongoCollection<Document> collection = database .getCollection("people") .withTimeout(300L, MILLISECONDS); // ... perform operations on MongoCollection }
트랜잭션
트랜잭션 구현 defaultTimeout()
위해 새 ClientSession 인스턴스 만드는 경우 인스턴스 빌드할 때 ClientSessionOptions
메서드를 사용합니다. 이 옵션을 사용하여 다음 메서드에 대한 시간 제한을 지정할 수 있습니다.
다음 코드는 ClientSession
을 인스턴스화할 때 defaultTimeout
를 설정하다 방법을 보여줍니다.
ClientSessionOptions opts = ClientSessionOptions.builder() .defaultTimeout(200L, MILLISECONDS) .build(); ClientSession session = mongoClient.startSession(opts); // ... perform operations on ClientSession
defaultTimeout
를 지정하지 않으면 운전자 상위 MongoClient
에 설정하다 시간 초과 값을 사용합니다.
TransactionOptions
인스턴스 빌드할 때 timeout()
메서드를 호출하여 트랜잭션 수준 시간 제한을 설정하다 수도 있습니다. 이 옵션을 설정하면 트랜잭션 범위에서 수행되는 모든 작업에 시간 초과가 적용됩니다.
TransactionOptions transactionOptions = TransactionOptions.builder() .timeout(200L, MILLISECONDS) .build();
클라이언트 암호화
클라이언트 측 필드 레벨 암호화 (CSFLE)를 사용하는 경우 운전자 timeoutMS
옵션을 사용하여 암호화 및 암호 해독 작업에 허용되는 시간을 제한합니다. ClientEncryptionSettings
인스턴스 빌드할 때 timeout()
메서드를 호출하여 ClientEncryption
인스턴스 에 대한 시간 초과 옵션을 설정하다 수 있습니다.
ClientEncryption
인스턴스 구성할 때 제한 시간을 지정하면 제한 시간이 해당 인스턴스 에서 수행되는 모든 작업의 수명을 제어합니다. ClientEncryption
을(를) 인스턴스화할 때 시간 초과를 제공하지 않으면 인스턴스 는 ClientEncryption
생성자에 사용된 MongoClient
의 시간 초과 설정을 상속합니다.
클라이언트 와 ClientEncryption
에서 모두 timeoutMS
을 설정하다 ClientEncryption
에 제공된 값이 우선합니다.
Cursors
커서는 CSOT 기능 사용할 때 구성 가능한 시간 초과 설정을 제공합니다. 커서 수명 또는 커서 반복 모드 구성하여 커서 처리를 조정할 수 있습니다. 시간 초과 모드 구성하려면 Iterable
을 반환하는 작업을 수행할 때 timeoutMode()
메서드를 사용합니다.
커서를 생성하는 작업의 경우 시간 초과 설정은 커서 의 수명을 제한하거나 원래 작업과 모든 후속 호출에 별도로 적용할 수 있습니다.
참고
상속된 시간 초과
커서 시간 초과 모드 설정하려면 MongoClientSettings
, MongoDatabase
또는 MongoCollection
에서 시간 초과를 설정하다 해야 합니다.
커서에 대해 자세히 학습 커서에서 데이터 액세스 가이드 를 참조하세요.
커서 수명 모드
커서 수명 모드 시간 초과 설정을 사용하여 커서 의 전체 수명을 제한합니다. 이 모드 에서는 애플리케이션 커서 초기화하고, 커서 메서드에 대한 모든 호출을 완료하고, 지정된 시간 제한 내에 모든 문서를 반환해야 합니다. 그렇지 않으면 커서의 수명이 만료되고 운전자 시간 초과 오류가 발생합니다.
close()
메서드를 호출하여 커서 닫으면 서버 측 리소스가 정리되도록 killCursors
명령에 대한 시간 제한이 재설정됩니다.
다음 예시 커서 초기화되고 상속된 제한 시간 내에 모든 문서가 검색되도록 커서 시간 제한을 설정하다 방법을 보여 줍니다.
FindIterable<Document> cursorWithLifetimeTimeout = collection .find(gte("age", 40)) .timeoutMode(TimeoutMode.CURSOR_LIFETIME);
커서 반복 모드
커서 반복 모드 시간 초과를 설정하여 각 호출을 next()
, hasNext()
및 tryNext()
메서드로 제한합니다. 시간 초과는 각 호출이 완료될 때 새로 고침됩니다. 이는 고정 사이즈 컬렉션 또는 변경 스트림에서 find()
메서드가 반환하는 테일 커서(tailable cursor)와 같은 모든 테일 커서(tailable cursor)의 기본값 모드 입니다.
다음 코드 예시 ITERATION
시간 제한 모드 가 있는 커서 사용하여 db.people
컬렉션 의 문서를 반복한 다음 각 문서 의 name
필드 값을 검색하고 인쇄합니다.
try (MongoCursor<Document> cursorWithIterationTimeout = collection .find(gte("age", 40)) .timeoutMode(TimeoutMode.ITERATION) .cursor() ) { while (cursorWithIterationTimeout.hasNext()) { System.out.println(cursorWithIterationTimeout.next().toJson()); } }
GridFS.
메서드를 사용하여 를 인스턴스화할 때 GridFS 작업에 대한 시간 초과 옵션을 설정하다 수 GridFSBucket
withTimeout()
있습니다. 이 GridFSBucket
제한 시간은 데이터 업로드 및 다운로드와 같이 버킷에서 수행되는 모든 작업에 적용됩니다. 시간 제한을 설정하다 하지 않으면 인스턴스 MongoDatabase
생성에 사용한 인스턴스의 시간 제한 설정을 상속합니다.
다음 코드는 GridFSBucket
을 인스턴스화할 때 시간 제한을 설정하다 방법을 보여줍니다.
GridFSBucket gridFSBucket = GridFSBuckets .create(database) .withTimeout(200L, MILLISECONDS);
중요
입력 스트림 시간 초과 지원
작업 시간 초과가 있는 GridFSBucket
에서 uploadFromStream()
메서드를 호출하면 InputStream
클래스에 고유한 읽기 시간 초과 지원 없기 때문에 시간 초과 위반이 발생할 수 있습니다. 이로 인해 작업이 지정된 시간 초과 제한을 초과하여 연장되어 시간 초과 예외가 발생할 수 있습니다.
API 문서
Java 운전자 에서 시간 초과를 사용하는 방법에 대해 자세히 학습 다음 API 설명서를 참조하세요.