springboot访问mongo异常Transaction numbers are only allowed on a replica set member or mongos

2020-02-06 15:40:07 | 编辑

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

pom

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

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驱动

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

然后不使用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

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
      <version>2.1.0.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>org.mongodb</groupId>
          <artifactId>mongodb-driver</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

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

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

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号