예제 #1
0
        public IConnection AcquireConnection(AccessMode mode)
        {
            _routingTableManager.EnsureRoutingTableForMode(mode);
            while (true)
            {
                Uri uri;

                switch (mode)
                {
                case AccessMode.Read:
                    uri = _loadBalancingStrategy.SelectReader(_routingTableManager.RoutingTable.Readers);
                    break;

                case AccessMode.Write:
                    uri = _loadBalancingStrategy.SelectWriter(_routingTableManager.RoutingTable.Writers);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown access mode {mode}");
                }

                if (uri == null)
                {
                    // no server known to routingTable
                    break;
                }
                IConnection conn = CreateClusterConnection(uri, mode);
                if (conn != null)
                {
                    return(conn);
                }
                //else  connection already removed by clusterConnection onError method
            }
            throw new SessionExpiredException($"Failed to connect to any {mode.ToString().ToLower()} server.");
        }
예제 #2
0
        public async Task <IConnection> AcquireConnectionAsync(AccessMode mode, string database, Bookmark bookmark)
        {
            var routingTable = await _routingTableManager.EnsureRoutingTableForModeAsync(mode, database, bookmark)
                               .ConfigureAwait(false);

            while (true)
            {
                Uri uri;

                switch (mode)
                {
                case AccessMode.Read:
                    uri = _loadBalancingStrategy.SelectReader(routingTable.Readers, database);
                    break;

                case AccessMode.Write:
                    uri = _loadBalancingStrategy.SelectWriter(routingTable.Writers, database);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown access mode {mode}");
                }

                if (uri == null)
                {
                    // no server known to routingTable
                    break;
                }

                var conn =
                    await CreateClusterConnectionAsync(uri, mode, database, bookmark).ConfigureAwait(false);

                if (conn != null)
                {
                    return(conn);
                }

                //else  connection already removed by clusterConnection onError method
            }

            throw new SessionExpiredException($"Failed to connect to any {mode.ToString().ToLower()} server.");
        }