2016-03-21 16 views
0

Ich bin ein Neuling, MongoDB zu verwenden. Ich importierte gerade das neueste MongoDB Java-Client über Maven:MongoDB Java-Client WriteConcern funktioniert nicht

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

Und dann habe ich ein sehr einfaches Programm, um den Einsatz Betrieb zu testen.

 //I use a replicaset 
    MongoClient mongoClient = new MongoClient(
      Arrays.asList(new ServerAddress("10.12.16.136", 29017), 
        new ServerAddress("10.12.16.136", 29018), 
        new ServerAddress("10.12.16.136", 29019))); 

    //I just want to write and ignore any database errors. (This does not work) 
    mongoClient.setWriteConcern(WriteConcern.UNACKNOWLEDGED); 

    //Get database and collection 
    MongoDatabase database = mongoClient.getDatabase("test"); 
    MongoCollection<Document> collection = database.getCollection("realtime"); 

    //This does not work too. 
    collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED); 

    //Make a simple object to insert. I already have a document with the same _id in the database and I don't want to see the exception via the WriteConcern operation. 
    Document doc = Document("longitude", longitude) 
      .append("latitude", latitude) 
      .append("velocity", velocity) 
      .append("soc", soc) 
      .append("_id", 12345678); 

    //WriteConcern.UNACKNOWLEDGED doesn't work. An exception will be raised. 
    collection.insertOne(doc); 

Wie kann ich das Richtige tun?

Antwort

2

Das ist, weil collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED); erzeugt ein neues MongoCollection Objekt mit einer anderen Schreib Sorge, die Sie nie benutzen:

/** * Erstellen Sie eine neue MongoCollection Instanz mit einer anderen Schreib Sorge. * * @param writeConcern das neue {@link com.mongodb.WriteConcern} für die Sammlung * @return eine neue MongoCollection Instanz mit den unterschiedlichen writeConcern */

MongoCollection withWriteConcern (WriteConcern writeConcern);

Der folgende Code:

MongoCollection<Document> dup = collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED); 
... 
dup.insertOne(doc); 

sollte funktionieren, das heißt ohne Fehler ausgelöst.

Was die MongoClient Ebene Schreib Sorge, die nicht an die Datenbank weitergegeben wird:

public MongoDatabase getDatabase(final String databaseName) { 
    MongoClientOptions clientOptions = getMongoClientOptions(); 
    return new MongoDatabaseImpl(databaseName, clientOptions.getCodecRegistry(), clientOptions.getReadPreference(), 
      clientOptions.getWriteConcern(), createOperationExecutor()); 
} 

Wie Sie sehen können, wird die Schreib Sorge von MongoClientOptions ignorieren den Parameterwert mongoClient.setWriteConcern() Methode übergeben genommen wird, was sein kann, ein Käfer.

Also, eine globale Schreib Sorge richtig einzustellen, müssen Sie eine Instanz von MongoClientOptions erstellen:

MongoClientOptions options = MongoClientOptions 
    .builder() 
    .writeConcern(WriteConcern.UNACKNOWLEDGED) 
    .build(); 

und übergibt es an den MongoClient Konstruktor.

+1

Sie haben nicht den ganzen Code richtig gelesen. Hatte auch diese Zeile vor allem 'mongoClient.setWriteConcern (WriteConcern.UNACKNOWLEDGED)'. Sie haben also einen "globalen Effekt" erwartet. Die Einstellungen für die Sammlung sind nur eine Frage der Konsequenz. –

+0

@BlakesSeven bearbeitete Antwort –

+0

Es wäre wahrscheinlich einfacher gewesen, einfach zu sagen: '.withWriteConcern (WriteConcern.UNACKNOWLEDGED)' an das Ende von '.getDatabase()' oder '.getCollection()', wo die beabsichtigten Bedenken sollte benutzt werden. Im Allgemeinen ist "UNACKNOWLEDGED" ziemlich "rohe Gewalt" und sollte nur verwendet werden, wenn Sie wirklich wissen, was Sie tun.Sicherlich nicht "nur" um doppelte Fehler zu vermeiden, da es weit bessere, "sicherere" und weniger aufdringliche Methoden gibt, dies zu tun. Denken Sie daran, dass das OP hier eindeutig nicht der Experte ist. –

0

Ich hatte diese Ausnahme, als auf leere Sammlung bereits in MongoDB vorhanden war, und ich versuchte, eine weitere Sammlung versehentlich zu erstellen, also wenn ich die vorhandene Sammlung löschte und dann eine Post-API, dann funktionierte es gut für mich .. So besser zuerst Ihre bestehende Sammlung und dann versuchen, rufen Sie eine CRUD-API .. , wenn es eine Java-Entität mit Collection (Name = "STUDENT"), und Sie erneut versuchen, eine Sammlung mit zu erstellen Name Student, dieser Fehler kommt

+1

Das sieht eher wie ein Kommentar aus. – Sunil

Verwandte Themen