MongoDB:java.lang.IllegalStateException:状态应该是:来自同一个 MongoClient 的 ClientSession

问题描述 投票:0回答:1

我有一个应用程序,将数据存储在使用的MongoDB Atlas(集群层: M0 沙盒共享 RAM,512 MB 存储) 收集作为交易。示例代码如下。

MongoClient mongoClient = MongoClients.create("Connection-URL");
MongoDatabase mongoDatabase = mongoClient.getDatabase("DATABASE");

ClientSession clientSession = mongoClient.startSession();
clientSession.startTransaction();
status = mongoDatabase.getCollection(collection).insertOne(clientSession, insertDocument);

if (status == IS_SUCCESS) {
   clientSession.commitTransaction();
} else {
   clientSession.abortTransaction();
}

clientSession.close();

这对于多个请求来说效果很好。但是,一段时间后(不能说出确切的时间),如果我调用上述功能,我会收到以下异常。

java.lang.IllegalStateException: state should be: ClientSession from same MongoClient
    at com.mongodb.assertions.Assertions.isTrue(Assertions.java:72)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:279)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:206)
    at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1053)
    at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:503)
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:499)
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:492)
    at mongo.impl.InsertDocuments.insertItem(InsertDocuments.java:24)

并且一直失败......

我正在使用以下客户端连接器从我的 JAVA 应用程序进行连接

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.12.8</version>
</dependency>

有谁知道为什么会这样?

java mongodb illegalstateexception mongodb-atlas mongo-java-driver
1个回答
0
投票

按如下方式设置 MongoDB 客户端后,我不再遇到前面提到的错误(在 Singleton 类中使用它)。

ConnectionString connectionString = new ConnectionString("mongoUrl");
CodecRegistry pojoCodecRegistry = CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build());
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);
MongoClientSettings clientSettings = MongoClientSettings.builder()
                    .retryWrites(true)
                    .applyConnectionString(connectionString)
                    .codecRegistry(codecRegistry)
                    .applyToConnectionPoolSettings((ConnectionPoolSettings.Builder builder) -> {
                        builder.maxSize(mongoMaxPoolSize) //connections count
                                .minSize(5)
                                .maxConnectionLifeTime(30, TimeUnit.MINUTES)
                                .maxConnectionIdleTime( 30000, TimeUnit.MILLISECONDS);
                    })
                    .applyToSocketSettings(builder -> {
                        builder.connectTimeout(2000, TimeUnit.MILLISECONDS);
                    })
                    .build();
mongoClient = MongoClients.create(clientSettings);
© www.soinside.com 2019 - 2024. All rights reserved.