2

Javaで実行するWebアプリケーション用にmongoDBをセットアップする適切な方法に関するアドバイスを探しています。mongoDBチュートリアルから、Mongoクラスのインスタンスは1つだけにする必要があることを理解しています。

Mongoクラスは、スレッドセーフであり、スレッド間で共有されるように設計されています。通常、特定のDBクラスターに対してインスタンスを1つだけ作成し、アプリ全体で使用します。

だから私はこれのためのシングルトンプロバイダーを持っています(私は注射にguiceを使用しています)

@Singleton
public class MongoProvider implements Provider<Mongo> {
    private Mongo mongo;

    public Mongo get() {
        if (mongo == null)
            mongo = new Mongo("localhost", 27017);
        return mongo;
    }
}

また、Webアプリでmongoを使用する必要がある場合は常に、プロバイダーを挿入して同じmongoのインスタンスを取得します。

public class MyService {
    private Provider<Mongo> mongoProvider;

    @Inject
    private MyService(Provider<Mongo> mongoProvider) {
        this.mongoProvider = mongoProvider;
    }

    public void execute() {
        DB db = mongoProvider.get().getDB("mydatabase");
        DBCollection coll = db.getCollection("mycollection");

        // Do stuff in collection
        ...
    }
}

私が奇妙だと思うのは、データベースにアクセスするたびに、mongoから次のようなログを取得することです。

[initandlisten] 192.168.1.33:54297#15から受け入れられた接続

[initandlisten] 192.168.1.33:54299#16から受け入れられた接続

これまでのところ問題はありませんが、それが良い習慣であり、受け入れられる接続数が多すぎても問題が発生しないのではないかと思います。

  • また、アプリ全体でDBオブジェクトのインスタンスを1つだけ持つ必要がありますか?
  • しばらくすると自動的に接続を閉じるように、MongoDBを別の方法で構成する必要がありますか?または、手動で接続を閉じる必要がありますか?Mongoでclose()メソッドを使用する方法について読んだことがありますが、いつ呼び出すか、呼び出すかどうかはわかりません。

アドバイスありがとうございます。

4

2 に答える 2

1

MondoDB サイトに次のようなものを作成しました。

「Java MongoDB ドライバーはスレッド セーフです。たとえば、Web サービス環境で使用している場合は、単一の MongoClient インスタンスを作成する必要があり、すべての要求で使用できます。MongoClient オブジェクトは、サーバーへの接続の内部プールを維持します。データベース (デフォルトのプール サイズは 10) 。DB へのすべての要求 (検索、挿入など) に対して、Java スレッドはプールから接続を取得し、操作を実行し、接続を解放します。これは、使用される接続 (ソケット) を意味します。毎回違うかもしれません。」

そして、あなたの質問に完全に答えていると思うMongoSiteのFAQから。

http://docs.mongodb.org/manual/faq/developers/#why-does-mongodb-log-so-many-connection-accepted-events

于 2013-04-18T09:27:17.640 に答える
1

これは良い習慣です。Mongo の各インスタンスは接続プールを管理するため、mongod ログには、プール内の接続ごとに 1 つずつ、複数の接続が表示されます。デフォルトのプール サイズは 10 ですが、MongoOptions の connectionsPerHost フィールドを使用して構成できます。

Mongo インスタンスは DB インスタンスのキャッシュも維持するため、それらを自分でシングルトンとして維持することについて心配する必要はありません。

接続を自動的に閉じるように Mongo を構成する必要はありません。適切なタイミングで Mongo#close を呼び出して、接続プール内のすべてのソケットを閉じることができます。

于 2012-06-01T15:02:17.833 に答える