sql >> データベース >  >> NoSQL >> MongoDB

JavaからローカルmongoDBに接続できません

    自分の(実行中の)MongoDBサーバーに対してコードを実行しましたが、同じエラーが表示されます。私が驚いたのは、エラーが「タイムアウトする前に30000ms待機しています」と表示されていることですが、コードは30秒未満で完了します。これにより、問題が何であるかについてのヒントが得られます。

    これは非同期であることを忘れないでください。したがって、すべての操作が同じスレッドで順番に実行されるとは限りません。実際に起こっているのはmain データベースへの呼び出しが終了する前にメソッドが終了しています。

    結果が返ってくるのを待ってから終了するようにコードを変更すると、はるかに合理的な結果が得られます。

    コード:

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(1);
        // connect to the local database server,default:127.0.0.1:27017
        MongoClient mongoClient = MongoClients.create();
        // get handle to "testDB" database
        MongoDatabase database = (MongoDatabase) mongoClient.getDatabase("testDB");
        SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
            @Override
            public void onResult(final Void result, final Throwable t) {
                System.out.println("Operation Finished!");
                latch.countDown();
            }
        };
        // get a handle to the "test" collection
        MongoCollection<Document> collection = database.getCollection("test");
        collection.insertOne(new Document("lala", "hehe"), callbackWhenFinished);
    
        latch.await();
    }
    

    結果:

    Aug 11, 2015 9:31:34 AM com.mongodb.diagnostics.logging.JULLogger log
    INFO: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
    Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
    INFO: No server chosen by PrimaryServerSelector from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, all=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
    Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
    INFO: Opened connection [connectionId{localValue:1, serverValue:4}] to localhost:27017
    Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
    INFO: Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 0, 2]}, minWireVersion=0, maxWireVersion=3, electionId=null, maxDocumentSize=16777216, roundTripTimeNanos=1281647}
    Aug 11, 2015 9:31:35 AM com.mongodb.diagnostics.logging.JULLogger log
    INFO: Opened connection [connectionId{localValue:2, serverValue:5}] to localhost:27017
    Operation Finished!
    

    ちなみに、特にJava 8を使用していると言っているので、コードをさらに単純化することができます。

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(1);
        // connect to the local database server,default:127.0.0.1:27017
        MongoClient mongoClient = MongoClients.create();
        // get handle to "testDB" database
        MongoDatabase database = mongoClient.getDatabase("testDB");
        // get a handle to the "test" collection
        MongoCollection<Document> collection = database.getCollection("test");
    
        collection.insertOne(new Document("lala", "hehe"),
                             (result, t) -> {
                                 System.out.println("Operation Finished!");
                                 latch.countDown();
                             });
    
        latch.await();
    }
    


    1. Express.jsとconnect-mongoセッションの継続時間

    2. 文字列としてMongoからBinDataUUIDを取得します

    3. 2022年のMongoDBチュートリアル– MongoDBとは何ですか?

    4. MongoDBサーバーには、資格情報がなくてもアクセスできます