JAvaでmongodb接続で発生した問題

3395 ワード

モノリシックモードでmongodyの接続を確立するには、操作が完了するたびに接続を閉じる必要がありますか?
  • モノリシックモードのMongoDB接続の確立については、ここでMongoClient接続プール使用法
  • が確立されると、操作ごとに同じインスタンスが呼び出され、MongoClientはスレッドが安全になり、問題はないようです.しかし突然、これらの接続が取得された後、操作が完了しても自発的に解放されず、ずっと占有されるのではないかと考えた.

  • -そこでいろいろな資料を探し始めました.この文章はイメージ的な説明をしています.MongoDBの接続プールと管理です.答えは必要ありません.リレーショナル・データベースでは、使用するデータベース接続を閉じる必要があります.そうしないと、接続を大量に作成すると、データベースのダウンタイムに至るまでリソースの浪費が発生します.
    通常、newのconnectionに慣れており、finally文でconnectionを呼び出すclose()メソッドで閉じられます.ちょうど、mongodyでnewのMongoを見ると、close()メソッドもあることがわかります.そこで、DB操作が必要なメソッドでmongoインスタンスをnewし、mongoを呼び出す場合がある.getDB()メソッドは対応する接続を取得し、データを操作する後mongoを呼び出す.close()メソッドを使用して接続を閉じます.何の問題もないように見えますが、mongoのAPIをもう一度検討すると、このような耳の操作は庭師が花に水をかけたときに水を1バレル打って、それから水を1スプーンすくって花を1輪かけて、それから彼は水を1バレル全部注いで、再び水を1バレル打って、水を1スプーンすくって別の花をかけました..
    ここまで言うと皆さんもご存知のように、new Mongo()のときに接続プールが作成され、getDB()はこの接続プールから利用可能な接続を1つだけ取ります.接続プールはタイムリーに閉じる必要はありません.プログラムのライフサイクルでこのような単例を維持することができます.接続プールから取り出した接続については、閉じる必要がありますか?答えはNOです.DBにはclose()のような方法はありません.mongodyでは、1つの接続プールが一定数の接続を維持し、必要に応じてgetDB()を呼び出して接続プールに接続を取得し、mongoはこのDBがデータ操作を実行したときに自動的に接続プールに接続を回収します.だからmongodyでは接続が閉じていない問題を心配する必要はありません.すべての操作が終了したり、プログラム全体がshutdownになったりする必要があるときにmongoのclose()メソッドを呼び出す必要があります.
    MongoDBセキュリティ認証付き接続MongoClientOptionsの設定方法
    MongoClientの作成方法を管理するこの記事では、MongoDB接続for javaについて詳しく説明します.
    セキュリティの検証が必要なので、このようなものを選びました.
     MongoClientOptions clientOptions =   
        new MongoClientOptions.Builder()  
        .connectionsPerHost(50)  
        .maxWaitTime(2000).build();  
    List lstCredentials =   
            Arrays.asList(MongoCredential.createMongoCRCredential(  
                "admin", "myinfo", "123456".toCharArray()));  
    client = new MongoClient(new ServerAddress("127.0.0.1"),lstCredentials, clientOptions);  
    client.close();   

    しかし、プロジェクトを実行しているのに、認証エラーを報告し、調べてみると発見されました.やり方が違う.
     Arrays.asList(MongoCredential.createMongoCRCredential(  
                "admin", "myinfo", "123456".toCharArray()));  

    に改心
     Arrays.asList(MongoCredential.createCredential(  
                "admin", "myinfo", "123456".toCharArray()));  

    よし...