java - MongoDB retryWrites=true 不适用于 3.6+ 版本
问题描述
我已经阅读了https://docs.mongodb.com/manual/core/retryable-writes/并设置了所有必需的属性以使其工作,但到目前为止还没有运气。
有 3 个成员副本,当程序运行以插入记录时,我杀死了主节点,而当新主节点的选举发生时,我的代码中发生了循环,并且这些记录在新成员被选举后不会重试写入。
本地 MongoDB 版本
``
mongo --version
MongoDB shell version v3.6.6
git version: 6405d65b1d6432e138b44c13085d0c2fe235d6bd
OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
allocator: system
modules: enterprise
build environment:
distarch: x86_64
target_arch: x86_64
``
Mongo Java 驱动程序
``compile group: 'org.mongodb', name: 'mongodb-driver', version: '3.6.4'
compile group: 'org.mongodb', name: 'mongodb-driver-core', version: '3.6.4'
compile group: 'org.mongodb', name: 'bson', version: '3.6.4'``
Mongo 连接字符串
``dbUri = "mongodb://localhost:28000,localhost:28001,localhost:28002/test?replicaSet=rs01&retryWrites=true&w=2";``
使用 MongoClient 创建连接
MongoClient mongoClient = new MongoClient(new MongoClientURI(dbUri));
insert 正在使用 insertOne,如下所示
``
private static void insertData(MongoClient mongoClient) {
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("customer");
// collection.withWriteConcern(WriteConcern.W2);
deleteOldDocumets(collection);
int customerId = 0;
while (customerId < 1000) {
++customerId;
try {
Document document = new Document();
document.put("name", "user" + customerId);
document.put("age", customerId);
collection.insertOne(document);
logger.info("Customer : " + customerId + " Time is : "
+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
Thread.sleep(10);
} catch (Exception e) {
logger.info("Primary connection closed, starting election in 5 secs");
}
}
mongoClient.close();
}``
### DB master props ###
``MongoDB Enterprise rs01:PRIMARY> db.isMaster();
{
"hosts" : [
"localhost:28000",
"localhost:28001",
"localhost:28002"
],
"setName" : "rs01",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "localhost:28000",
"me" : "localhost:28000",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1540647424, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2018-10-27T13:37:04Z"),
"majorityOpTime" : {
"ts" : Timestamp(1540647424, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2018-10-27T13:37:04Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2018-10-27T13:37:10.713Z"),
"logicalSessionTimeoutMinutes" : 30,
"minWireVersion" : 0,
"maxWireVersion" : 6,
"readOnly" : false,
"ok" : 1,
"operationTime" : Timestamp(1540647424, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1540647424, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
``
非常感谢任何线索。
解决方案
我对 java 驱动程序 3.6.3 有同样的问题,我的解决方案是将驱动程序版本升级到 3.8.2。另请检查此错误修复: https ://jira.mongodb.org/browse/JAVA-2859?jql=project%20%3D%20JAVA%20AND%20issuetype%20%3D%20Bug%20AND%20fixVersion%20%3D %203.7.1%20ORDER%20BY%20priority%20DESC
推荐阅读
- java - 当工作队列为空并且所有线程都停止工作时如何停止执行?
- javascript - HTML 表单 onsubmit="return false;" 不工作
- python - 使用 group by 后,线图在 python bokeh 中不合适
- javascript - 如何将base 64中的WSQ指纹转换为javascript中的图像格式
- c# - 从 C# MongoDb 启用分片
- php - 如何使用 jQuery 切换()和隐藏切换链接或按钮?
- javascript - 如何在 HTML 中显示未找到数据
- html - 使用 flexbox 将可滚动容器与选项卡面板(Office UI Fabric Pivot)样式布局对接
- spring-boot - 如何在 Spring Boot 中从我的请求对象创建正确的请求参数?
- python - 无法在蒙特卡洛模拟足够极端的值