public async Task <DbCommandProxy> CreateCommandAsync(ConnectionFactoryParameters parameters, ICommandMetricsReportable metricsReporter, CancellationToken cancellationToken) { var connection = this.TryReuse(); if (connection == null) { connection = this._factory.CreateConnection(parameters); await connection.Connection.OpenAsync(cancellationToken).ConfigureAwait(false); if (!string.IsNullOrWhiteSpace(this._overriddenDatabaseName)) { connection.Connection.ChangeDatabase(this._overriddenDatabaseName); } } var command = new DbCommandProxy( connection.Id, connection.Connection.CreateCommand(), metricsReporter, this.OnCommandCompleted); this._workingCommands.TryAdd(command, connection); return(command); }
public async Task <DbCommandProxy> CreateCommandAsync(ConnectionFactoryParameters parameters, ICommandMetricsReportable metricsReporter, CancellationToken cancellationToken) { var preparer = new TaskCompletionSource <bool>(); lock (this._commandQueueLock) { if (!this._isCommandExecuting) { this._isCommandExecuting = true; preparer.SetResult(true); } else { this._commandPreparerQueue.Enqueue(preparer); } } await preparer.Task.ConfigureAwait(false); var connection = await this.GetConnectionAsync(parameters, cancellationToken).ConfigureAwait(false); var sourceCommand = connection.Connection.CreateCommand(); if (this._transaction != null) { sourceCommand.Transaction = this._transaction; } var command = new DbCommandProxy( connection.Id, sourceCommand, metricsReporter, this.OnCommandCompleted); return(command); }
public async Task <DbCommandProxy> CreateCommandAsync(ConnectionFactoryParameters parameters, ICommandMetricsReportable metricsReporter, CancellationToken cancellationToken) { var(connection, index, payOutNumber) = await this._pool.GetConnectionAsync( parameters, _maxExecutionTime, nameof(GlobalConnectionPoolStrategy), cancellationToken) .ConfigureAwait(false); //ChangeDatabase はあまり対応したくない感じだけど、一応指定されてたらここで反映しよう。 if (!string.IsNullOrWhiteSpace(this._overriddenDatabaseName) && connection.Connection.Database != this._overriddenDatabaseName) { await connection.Connection.ChangeDatabaseAsync(this._overriddenDatabaseName, cancellationToken).ConfigureAwait(false); } var sourceCommand = connection.Connection.CreateCommand(); var command = new DbCommandProxy( connection.Id, sourceCommand, metricsReporter, x => { this._workingCommands.TryRemove(x, out _); this._pool.ReleaseConnection(index, payOutNumber); }); this._workingCommands.TryAdd(command, true); return(command); }