gpt4 book ai didi

java - 如何使用 REPLICA_SET_SECONDARY 类型对 MongoDB 服务器执行写操作?

转载 作者:行者123 更新时间:2023-12-01 09:13:40 27 4
gpt4 key购买 nike

我在 MongoDB 副本集中有 2 台服务器,一台是主服务器,另一台是辅助服务器。我的应用程序在主服务器上完美运行,但在辅助服务器上运行时,我收到以下警告:

INFO: No server chosen by WritableServerSelector from cluster description ClusterDescription{type=REPLICA_SET, connectionMode=SINGLE, serverDescriptions=[ServerDescription{address=localhost:27017, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 2, 11]}, minWireVersion=0, maxWireVersion=4, maxDocumentSize=16777216, roundTripTimeNanos=691940, setName='rs2', canonicalAddress=192.168.71.22:27017, hosts=[192.168.70.197:27017, 192.168.71.22:27017, PC:27017], passives=[], arbiters=[], primary='PC:27017', tagSet=TagSet{[]}, electionId=null, setVersion=3}]}. Waiting for 30000 ms before timing out

读取操作(代码中选择“2”)在 30 秒超时后正确执行。写入操作(在代码中选择“1”和“3”)会触发此警告再次出现并且不起作用。我应该在 MongoDB 设置中更改什么或添加到代码中才能执行写入操作?

代码:

package ru.energodata;

import com.mongodb.*;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSInputFile;


public class Main {
public static void main(String[] args) {
Scanner scanner;
int selection;
boolean exit = false;
MongoClient mongoClient = new MongoClient("localhost", 27017);
DB db = mongoClient.getDB("imagedb");
GridFS gfsPhoto = new GridFS(db, "photo");

while (!exit)
{
System.out.println("Choose action with the DB");
System.out.println("1 - add files to DB");
System.out.println("2 - list files");
System.out.println("3 - remove files");
scanner = new Scanner(System.in);
if(scanner.hasNextInt()) {
selection = scanner.nextInt();

if (selection == 1) {
String path = "C:\\2015";
String fileName;
File dir = new File(path);
File[] imageFile = dir.listFiles();
try {
for (File anImageFile : imageFile) {
GridFSInputFile gfsFile = gfsPhoto.createFile(anImageFile);
fileName = anImageFile.getName();
System.out.println("Current file: " + fileName);
// set a new filename for identify purpose
gfsFile.setFilename(fileName);
// save the image file into mongoDB
gfsFile.save();
}
} catch (MongoException | IOException e) {
e.printStackTrace();
}
}

if (selection == 2) {
// print the result
System.out.println("Database content:");
DBCursor cursor = gfsPhoto.getFileList();
if (cursor.hasNext()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}

else {System.out.println("none.");
}
}
if (selection == 3) {
// remove the image file from mongoDB
DBCursor cursor = gfsPhoto.getFileList();
if (cursor.hasNext()) {
while (cursor.hasNext()) {
gfsPhoto.remove(cursor.next());
}
System.out.println("DB content deleted");
}
else {System.out.println("DB is empty");
}
}
}
else {
System.out.println("Select either 1, 2 or 3");
scanner = new Scanner(System.in);
}
}
}
}

最佳答案

我自己发现的。更改行:

MongoClient mongoClient = new MongoClient("localhost", 27017);

    MongoClientOptions options = MongoClientOptions.builder()
.readPreference(ReadPreference.nearest())
.writeConcern(WriteConcern.W2)
.build();
MongoClient mongoClient = new MongoClient(Arrays.asList(
new ServerAddress(serverList[0]),
new ServerAddress(serverList[1]),
new ServerAddress(serverList[2])),options);

其中serverList[]字符串数组包含副本集中所有服务器的地址。现在应用程序找到主服务器并连接到它。

INFO: Discovered replica set primary pc:27017
INFO: Opened connection [connectionId{localValue:5, serverValue:79}] to pc:27017

因此写入操作变得可用,因为您只能写入集合中的主服务器。

关于java - 如何使用 REPLICA_SET_SECONDARY 类型对 MongoDB 服务器执行写操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746181/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com