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都可以了,这也算是圆满解决了吧!