我正在使用java Mongo驱动程序3.2,我正在试图找出我应该拥有多个实例以及应该在应用程序中保留的内容。
因此,例如,MongoClient
表示应该只有一个应用实例。它还说它建立了一个连接池。哪个好。这些连接何时实际制作?我想确保我有效地使用游泳池。
当我MongoClient#getDataBase
时,与DB的连接是什么? MongoDatabase#getCollection
?或者某些时候我对集合本身执行操作,例如.find?
应该保存什么?我应该有多个数据库实例吗?收藏?还是只是客户?
主要是我试图确保我不会将自己局限于一个连接,但我也不会不必要地对数据库进行垃圾邮件。
答案 0 :(得分:2)
一旦实例应该适用于每个应用程序。 MongoDB Driver Quick Tour - Java似乎很清楚。编辑:我对写作的理解是,当您在连接时调用MongoClient.getDB();
时,确保通过源代码进行解析(如果可用)以查看确切的时刻。编辑2:添加了MongoDB Java驱动程序的链接MongoDB Driver,特别是您检查的类MongoClient,它扩展了Mongo.class
.getDB();
所在的位置。在这种方法中,他们检查数据库缓存,如果不是,他们会创建一个新的DB.class
实例。运行代码后,它会显示在Mongo.class
构造函数中,因此当您致电new MongoClient();
时,他们会调用connector.start()
public Mongo( ServerAddress addr , MongoOptions options )
throws MongoException {
_addr = addr;
_addrs = null;
_options = options;
_applyMongoOptions();
_connector = new DBTCPConnector( this , _addr );
_connector.start();
_cleaner = new DBCleanerThread();
_cleaner.start();
}
从他们的页面
// To directly connect to a single MongoDB server (note that this will not auto-discover the primary even
// if it's a member of a replica set:
MongoClient mongoClient = new MongoClient();
// or
MongoClient mongoClient = new MongoClient( "localhost" );
// or
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// or, to connect to a replica set, with auto-discovery of the primary, supply a seed list of members
MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
DB db = mongoClient.getDB( "mydb" );
此时,db对象将是与MongoDB服务器的连接 对于指定的数据库。有了它,您可以进行进一步的操作。
MongoClient类设计为线程安全并在其中共享 线程。通常,您只为给定的数据库创建一个实例 集群并在整个应用程序中使用它。
重要
创建许多MongoClient实例时:
All resource usage limits (max connections, etc) apply per MongoClient instance To dispose of an instance, make sure you call MongoClient.close() to clean up resources