private readonly Semaphore _tracker; //todo: semaphore a little heavy? #endregion Fields #region Constructors public PooledConnectionProvider(ConnectionStringBuilder builder) { _builder = builder; _idlePool = new Queue<IConnection>(builder.PoolSize); _tracker = new Semaphore(builder.PoolSize, builder.PoolSize); _timeout = builder.Timeout*1000; }
private static IConnectionProvider CreateNewProvider(ConnectionStringBuilder builder) { if (builder.Pooled) { return new PooledConnectionProvider(builder); } return new NormalConnectionProvider(builder); }
/// <summary> /// Initializes a new instance of the <see cref="PooledConnectionProvider"/> class. /// </summary> /// <param name="builder">The builder.</param> public PooledConnectionProvider(ConnectionStringBuilder builder) { _builder = builder; _timeout = builder.Timeout * 1000; _poolSize = builder.PoolSize; _lifetime = builder.Lifetime; _maintenanceTimer = new Timer(o => Cleanup(), null, 30000, 30000); }
/// <summary> /// Initializes a new instance of the <see cref="QueuedConnectionProvider"/> class. /// </summary> /// <param name="builder"> /// The builder. /// </param> public QueuedConnectionProvider(ConnectionStringBuilder builder) { _builder = builder; _idlePool = new Queue<IConnection>(builder.PoolSize); // Comment this out to prevent pre-allocation of the queue. It makes the // first caller suffer the latency penalty, but that's hardly an issue // for reasonable pool sizes. PreQueueConnections(builder.PoolSize); }
/// <summary> /// Initializes a new instance of the <see cref="Connection"/> class. /// </summary> /// <param name="builder">The builder.</param> internal Connection(ConnectionStringBuilder builder) { _builder = builder; Created = DateTime.Now; _client = new TcpClient { NoDelay = true, ReceiveTimeout = builder.QueryTimeout * 1000, SendTimeout = builder.QueryTimeout * 1000 }; _client.Connect(builder.Servers[0].Host, builder.Servers[0].Port); }
internal Connection(ConnectionStringBuilder builder) { _builder = builder; Client = new TcpClient(); Client.Connect(builder.Servers[0].Host, builder.Servers[0].Port); }
/// <summary> /// Creates a connection string builder. /// </summary> /// <param name="connectionString">The connection string.</param> /// <returns></returns> /// <exception cref="MongoException"> /// </exception> public static ConnectionStringBuilder Create(string connectionString) { var connection = connectionString; if (!connection.StartsWith(PROTOCOL, StringComparison.InvariantCultureIgnoreCase)) { try { connection = ConfigurationManager.ConnectionStrings[connectionString].ConnectionString; } catch (NullReferenceException) { throw new MongoException("Connection string is missing"); } if (string.IsNullOrEmpty(connection) || !connection.StartsWith(PROTOCOL, StringComparison.InvariantCultureIgnoreCase)) { throw new MongoException("Invalid connection string: the protocol must be mongodb://"); } } var parts = connection.Split(new[] { '?' }, StringSplitOptions.RemoveEmptyEntries); var options = parts.Length == 2 ? parts[1] : null; var sb = new StringBuilder(parts[0].Substring(PROTOCOL.Length)); var builder = new ConnectionStringBuilder { QueryTimeout = 30, Timeout = 30, EnableExpandoProperties = false, StrictMode = true, Pooled = true, PoolSize = 25, }; // var coreBuilder = new StringBuilder(); builder.BuildAuthentication(sb/*, coreBuilder*/) .BuildDatabase(sb) .BuildServerList(sb); BuildOptions(builder, options); return builder; }
public static ConnectionStringBuilder Create(string connectionString) { if (!connectionString.StartsWith(PROTOCOL, StringComparison.InvariantCultureIgnoreCase)) { throw new MongoException("Invalid connection string: the protocol must be mongodb://"); } var parts = connectionString.Split(new[]{'?'}, StringSplitOptions.RemoveEmptyEntries); var options = parts.Length == 2 ? parts[1] : null; var sb = new StringBuilder(parts[0].Substring(PROTOCOL.Length)); var builder = new ConnectionStringBuilder { QueryTimeout = 30, Timeout = 30, EnableExpandoProperties = false, StrictMode = true, Pooled = true, PoolSize = 25, }; var coreBuilder = new StringBuilder(); builder.BuildAuthentication(sb, coreBuilder) .BuildDatabase(sb) .BuildServerList(sb); BuildOptions(builder, options); return builder; }