在应用程序中,具有所需连接数的单个MongoClient 对象,使用连接池,将在这种情况下工作。连接池默认值为100,可根据需要修改(或配置)。
mongo 客户端对象可以在应用程序启动时创建,只有在应用程序关闭时才会关闭。这节省了与每个集合访问类中的 mongo 客户端对象创建连接相关的资源。
可以在整个应用程序中使用相同的 mongo 客户端对象。 singleton 类(维护 mongo 客户端对象的一个实例)可以被应用程序中需要连接到 MongoDB 数据库服务器的任何其他对象访问。
What is connection pooling?
在软件工程中,连接池是数据库的缓存
保持连接,以便在连接时可以重用
未来对数据库的请求是必需的。连接池是
用于提高在数据库上执行命令的性能。
为每个用户打开和维护一个数据库连接,
尤其是对动态数据库驱动网站的请求
应用,成本高,浪费资源。在连接池中,
创建连接后,将其放入池中并使用
再次,这样就不必建立新的连接。我摔倒
正在使用连接,建立并添加新连接
到游泳池。连接池还减少了
用户必须等待建立与数据库的连接。
示例代码:
/*
* Manages the MongoClient object and its settings like host, port, connection pool, etc.
*/
public class DBAccess {
private static MongoClient mongoClient;
private static DBAccess dbAccess;
// MongoClient with default settings
// NOTE: the code will have only one of the constructors
//private DBAccess() {
// final String connectionString = "mongodb://localhost:27017";
// this.mongoClient = MongoClients.create(connectionString);
//}
// MongoClient with custom settings.
// Private constructor, so that the class can be instantiated outside this class.
// NOTE: the code will have only one of the constructors
private DBAccess() {
MongoClientSettings settings =
MongoClientSettings.builder()
.applyToConnectionPoolSettings(builder ->
builder.maxSize(40).minSize(10))
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("localhost", 27017))))
.build();
mongoClient = MongoClients.create(settings);
}
public static MongoClient getConnection() {
if (dbAccess == null) {
dbAccess = new DBAccess();
}
return mongoClient;
}
public static void closeDatabase() {
mongoClient.close();
}
}
/*
* Class manages a collection.
*/
public class CollectionOneAccess {
public static String COLLECTION_ONE = "collection_one";
private MongoCollection<Document> collection;
public CollectionOneAccess(MongoDatabase db) {
collection = db.getCollection(COLLECTION_ONE);
}
public void printOneDocument() {
Document myDoc = collection.find().first();
System.out.println(myDoc.toJson());
}
// other CRUD operations ...
}
// Usage of DBAcess and CollectionOneAccess classes:
private static final String APP_DATABASE = "abc_db";
public static void main(String [] args) {
MongoDatabase database = DBAccess.getConnection().getDatabase(APP_DATABASE);
CollectionOneAccess one = new CollectionOneAccess(database);
one.printOneDocument();
// ...
}
Mongo 客户端
MongoClient 对象用于连接到 MongoDB 服务器,使用 getDatebase() 方法访问数据库并使用集合。
com.mongodb.client.MongoClient接口:
MongoDB 集群的客户端表示。实例可以
表示独立的 MongoDB 实例、副本集或
分片集群。这个类的实例负责
维护集群的最新状态,并可能缓存
与此相关的资源,包括后台线程
监控和连接池。
来自MongoDB Java documentation:
MongoClient 实例代表一个数据库连接池;即使有多个线程,您也只需要一个 MongoClient 类的实例。
重要提示:通常您只为一个 MongoClient 实例创建一个
给定 MongoDB 部署(例如,独立、副本集或分片
集群)并在您的应用程序中使用它。但是,如果您确实创建
多个实例:
- 所有资源使用限制(例如最大连接数等)均适用于每个 MongoClient 实例。
- 要处理实例,请调用 MongoClient.close() 来清理资源。
以下代码使用默认设置创建 MongoDB 客户端连接对象,如主机(“localhost”)和端口(@987654329@)、连接池等,并连接到 MongoDB 实例并访问 @ 987654330@数据库。
MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("testDB");
Mongo 客户端设置:
您可以使用MongoClientSettings 明确指定其他设置来控制MongoClient 的行为。
MongoClient mongoClient = MongoClients.create(MongoClientSettings settings)
ConnectionPoolSettings 对象指定与 MongoDB 服务器的连接池相关的所有设置。应用程序在创建客户端对象时创建此连接池。 ConnectionPoolSettings.Builder 是ConnectionPoolSettings 的构建器,具有指定连接池属性的方法。例如,maxSize(int maxSize):允许的最大连接数(默认为100)。其他方法包括,minSize、maxConnectionIdleTime等。
使用连接池设置实例化 MongoClient 的代码:
MongoClientSettings settings = MongoClientSettings.builder()
.applyToConnectionPoolSettings(builder ->
builder.maxSize(20))
.build();
MongoClient mongoClient = MongoClients.create(settings);
// ...
// Verify the connection pool settings
System.out.println("Pool size: " +
settings.getConnectionPoolSettings().getMaxSize());