zoukankan      html  css  js  c++  java
  • MogoDB驱动源码分析(2)

     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

    未完待续

  • 相关阅读:
    Neutron 理解 (1): Neutron 所实现的虚拟化网络 [How Netruon Virtualizes Network]
    openstack里面的Provider network 和 Tenant network 的区别
    Openstack网络相关概念比较复杂,经常使人混淆,本文进行相关说明。
    OpenStack 网络:Neutron 初探
    openstack 网络架构 nova-network + neutron
    Java 性能测试的四项原则
    微信公众号开发之微信买单
    微信公众号开发之如何使用JSSDK
    微信公众号开发之如何一键导出微信所有用户信息到Excel
    [内核驱动] 链表LIST_ENTRY的操作(转)
  • 原文地址:https://www.cnblogs.com/lirenqing/p/2009585.html
Copyright © 2011-2022 走看看