示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }