java replica set_springboot访问mongo异常Transaction numbers are only allowed on a replica set member or ...

java 使用springboot访问mongo副本集分片集群

pom

org.springframework.boot

spring-boot-starter-data-mongodb

application.properties

#mongodb

spring.data.mongodb.uri=mongodb://10.10.22.191:29000/project_data

java代码

@Autowired

private MongoTemplate mongoTemplate;

@RequestMapping("/test")

public String a(int a){

JSONObject o=new JSONObject();

o.put("projectId","test");

mongoTemplate.insert(o,"test");

return "";

}

异常信息

09:08:44.849 [http-nio-8002-exec-6] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Transaction numbers are only allowed on a replica set member or mongos; nested exception is com.mongodb.MongoWriteException: Transaction numbers are only allowed on a replica set member or mongos] with root cause

com.mongodb.MongoWriteException: Transaction numbers are only allowed on a replica set member or mongos

at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1055)

at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:498)

at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:482)

...

重来没有遇到过这个错误,网上也很难搜索到,而且我之前这样访问另外一个mongo集群就是可以的,现在这个错误就不知道怎么办了?

解决方法

我觉得可能是我两个mongo集群的版本不同或者集群其他的问题导致的

于是我就换了一种写法

pom

注释上面的pom,改为下面的mongo驱动

org.mongodb

mongo-java-driver

3.8.0

然后不使用mongoTemplate而是使用原生的写法

MongoClient m = new MongoClient("10.10.22.191:29000");

MongoDatabase d = m.getDatabase("project_data");

Document document = new Document("name", "张三")

.append("sex", "男")

.append("age", 18);

d.getCollection("test").insertOne(document);

这样居然就不报错了,所以这就是驱动和mongo版本不匹配导致的。

接着我查看了spring-boot-starter-data-mongodb对应mongo driver的版本为3.11.1所以我把上面mongo-java-driver的版本改为3.11.1再次测试一下,依然报错

com.mongodb.MongoWriteException: Transaction numbers are only allowed on a replica set member or mongos

所以肯定了,这就是driver版本的问题。

最终方案

最后我查看了我的spring-boot-starter-data-mongodb的版本是2.2.0对应mongo driver的版本是3.11.1,

然后我把spring-boot-starter-data-mongodb版本改为2.1.0对应的mongo driver版本是3.8.2,问题依然存在,妈的,对版本要求这么高,mongo driver只能是3.8.0吗?

于是我把mongo java driver彻底换成3.8.0

org.springframework.boot

spring-boot-starter-data-mongodb

2.1.0.RELEASE

org.mongodb

mongodb-driver

org.mongodb

mongo-java-driver

3.8.0

这样无论使用mongoClient还是最前面的直接使用mongoTemplate都可以了,这也算是圆满解决了吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值