class MongodbFactory2:> {
//public string connectionString = "mongodb://10.1.55.172";
public
string connectionString = ConfigurationManager.AppSettings["mongodb"];
public
string databaseName =
"myDatabase";
Mongo mongo;
MongoDatabase mongoDatabase;
public MongoCollection mongoCollection;
public MongodbFactory2()
{
mongo = GetMongo();
mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase;
mongoCollection = mongoDatabase.GetCollection() as MongoCollection;
mongo.Connect();
}
public
void Dispose()
{
this.mongo.Disconnect();
}
///
/// 配置Mongo,将类T映射到集合
///
private Mongo GetMongo()
{
var config =
new MongoConfigurationBuilder();
config.Mapping(mapping =>
{
mapping.DefaultProfile(profile =>
{
profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
});
mapping.Map();
});
config.ConnectionString(connectionString);
return
new Mongo(config.BuildConfiguration());
}
从上面的代码中可以看到有这么一句:mongo.Connect(),我第一印象就是创建客户端与服务端的连接,其实有了连接池,这个操作并非每次都创建远程连接,有的情况只是从连接池中直接返回可用连接对象而已。
从源码分析是如何利用连接池,连接是如何创建的。
1:Mongo类的Connect函数:需要跟踪_connection对象。
///
/// Connects to server.
///
///
///
Thrown when connection fails.
public
void Connect()
{
_connection.Open();
}
2:再看这句:return new Mongo(config.BuildConfiguration());
///
/// Initializes a new instance of the > ///
///
The mongo configuration.
public Mongo(MongoConfiguration configuration){
if(configuration ==
null)
throw
new ArgumentNullException("configuration");
configuration.ValidateAndSeal();
_configuration = configuration;
_connection = ConnectionFactoryFactory.GetConnection(configuration.ConnectionString);
}
上面代码的最后一句有_connection的生成过程。
3:可以跟踪到最终生成connection的函数,终于看到builder.Pooled这个参数了,这的值就是连接串中的参数。
///
/// Creates the factory.
///
///
The connection string.
///
private
static IConnectionFactory CreateFactory(string connectionString){
var builder =
new MongoConnectionStringBuilder(connectionString);
if(builder.Pooled)
return
new PooledConnectionFactory(connectionString);
return
new SimpleConnectionFactory(connectionString);
}
4:再看PooledConnectionFactory是如何创建连接的:这的作用就是将可用连接放入连接池中,而最终真正创建连接的函数是CreateRawConnection()
///