您的位置:首页 > 编程语言 > Go语言

MogoDB驱动源码分析(2)

2011-04-08 16:25 405 查看
MongoServer类源码分析

私有变量定义

#region private static fields
private static object staticLock = new object();
private static Dictionary<MongoServerSettings, MongoServer> servers = new Dictionary<MongoServerSettings, MongoServer>();
#endregion

#region private fields
private object serverLock = new object();
private object requestsLock = new object();
private MongoServerSettings settings;
private List<IPEndPoint> endPoints = new List<IPEndPoint>();
private MongoServerState state = MongoServerState.Disconnected;
private IEnumerable<MongoServerAddress> replicaSet;
private Dictionary<MongoDatabaseSettings, MongoDatabase> databases = new Dictionary<MongoDatabaseSettings, MongoDatabase>();
private MongoConnectionPool primaryConnectionPool;
private List<MongoConnectionPool> secondaryConnectionPools;
private int secondaryConnectionPoolIndex; // used to distribute reads across secondaries in round robin fashion
private int maxDocumentSize = BsonDefaults.MaxDocumentSize; // will get overridden if server advertises different maxDocumentSize
private int maxMessageLength = MongoDefaults.MaxMessageLength; // will get overridden if server advertises different maxMessageLength
private Dictionary<int, Request> requests = new Dictionary<int, Request>(); // tracks threads that have called RequestStart
private IndexCache indexCache = new IndexCache();
#endregion


创建一个MongoServer对象的实例,采用了工厂模式和线程安全的单例模式。提供了多种重载方法,默认连接为本机。

#region constructors
/// <summary>
/// Creates a new instance of MongoServer. Normally you will use one of the Create methods instead
/// of the constructor to create instances of this class.
/// </summary>
/// <param name="settings">The settings for this instance of MongoServer.</param>
public MongoServer(
MongoServerSettings settings
) {
this.settings = settings.Freeze();

foreach (var address in settings.Servers) {
endPoints.Add(address.ToIPEndPoint(settings.AddressFamily));
}
}
#endregion

#region factory methods
/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create() {
return Create("mongodb://localhost");
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="builder">Server settings in the form of a MongoConnectionStringBuilder.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
MongoConnectionStringBuilder builder
) {
return Create(builder.ToServerSettings());
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="settings">Server settings.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
MongoServerSettings settings
) {
lock (staticLock) {
MongoServer server;
if (!servers.TryGetValue(settings, out server)) {
server = new MongoServer(settings);
servers.Add(settings, server);
}
return server;
}
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="url">Server settings in the form of a MongoUrl.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
MongoUrl url
) {
return Create(url.ToServerSettings());
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="connectionString">Server settings in the form of a connection string.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
string connectionString
) {
if (connectionString.StartsWith("mongodb://")) {
var url = MongoUrl.Create(connectionString);
return Create(url);
} else {
var builder = new MongoConnectionStringBuilder(connectionString);
return Create(builder);
}
}

/// <summary>
/// Creates a new instance or returns an existing instance of MongoServer. Only one instance
/// is created for each combination of server settings.
/// </summary>
/// <param name="uri">Server settings in the form of a Uri.</param>
/// <returns>
/// A new or existing instance of MongoServer.
/// </returns>
public static MongoServer Create(
Uri uri
) {
var url = MongoUrl.Create(uri.ToString());
return Create(url);
}
#endregion


公开的属性

#region public properties
/// <summary>
/// Gets the admin database for this server.
/// </summary>
public virtual MongoDatabase AdminDatabase {
get { return GetDatabase("admin"); }
}

/// <summary>
/// Gets the connection pool (if connected to a replica set this is the connection pool to the primary).
/// </summary>
public virtual MongoConnectionPool ConnectionPool {
get { return primaryConnectionPool; }
}

/// <summary>
/// Gets the IP end points for this server.
/// </summary>
public virtual IEnumerable<IPEndPoint> EndPoints {
get { return endPoints; }
}

/// <summary>
/// Gets the index cache (used by EnsureIndex) for this server.
/// </summary>
public virtual IndexCache IndexCache {
get { return indexCache; }
}

/// <summary>
/// Gets the max document size for this server (not valid until connected).
/// </summary>
public virtual int MaxDocumentSize {
get { return maxDocumentSize; }
}

/// <summary>
/// Gets the max message length for this server (not valid until connected).
/// </summary>
public virtual int MaxMessageLength {
get { return maxMessageLength; }
}

/// <summary>
/// Gets a list of the members of the replica set (not valid until connected).
/// </summary>
public virtual IEnumerable<MongoServerAddress> ReplicaSet {
get { return replicaSet; }
}

/// <summary>
/// Gets the RequestStart nesting level for the current thread.
/// </summary>
public virtual int RequestNestingLevel {
get {
int threadId = Thread.CurrentThread.ManagedThreadId;
lock (requestsLock) {
Request request;
if (requests.TryGetValue(threadId, out request)) {
return request.NestingLevel;
} else {
return 0;
}
}
}
}

/// <summary>
/// Gets a read only list of the connection pools to the secondary servers (when connected to a replica set).
/// </summary>
public IList<MongoConnectionPool> SecondaryConnectionPools {
get { return secondaryConnectionPools.AsReadOnly(); }
}

/// <summary>
/// Gets the settings for this server.
/// </summary>
public virtual MongoServerSettings Settings {
get { return settings; }
}

/// <summary>
/// Gets the current state of this server (as of the last operation, not updated until another operation is performed).
/// </summary>
public virtual MongoServerState State {
get { return state; }
}
#endregion

未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: