Как изменить время ожидания запроса - PullRequest
0 голосов
/ 30 августа 2018

Для запросов с большим количеством записей у меня возникла проблема с тайм-аутом. Как я могу изменить время ожидания запроса?

Я попытался изменить соединение тайм-аута таким образом, но оно не работает:

connection.ConnectionTimeout = 60; // не работает (готово)

Класс:

public abstract class RepositoryBase<TEntity> : IRepositoryBase<TEntity>, IDisposable where TEntity : class
{
    protected SqlConnection _connection;
    protected string _connectionString;

    public RepositoryBase(string connectionString)
    {
        _connectionString = connectionString;
        SqlConnection connection = new SqlConnection(connectionString);
        if (connection.State == ConnectionState.Closed)
            connection.ConnectionTimeout = 60; // not working (ready)
            connection.Open();

        _connection = connection;
    }

    public List<T> GetEntitiesByQuery<T>(string Query)
    {
        using (var connection = _connection)
        {
            try
            {
                var entities = connection.Query<T>(Query);
                return entities.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Если тайм-аут доступен только для чтения, это означает, что вы уже подключены к базе данных, иначе вы можете изменить его. Попробуйте установить время ожидания в строке подключения. Может быть, это поможет лучше организовать код.

 <connectionStrings>  
    <... connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>
0 голосов
/ 30 августа 2018

Вам необходимо установить свойство CommandTimeout:

Время (в секундах) ожидания выполнения команды. Значение по умолчанию составляет 30 секунд.

Как его установить, зависит от используемой технологии доступа к данным.

Для простого ADO.NET:

IDbCommand cmd = ...;
cmd.CommandTimeout = 120; // 2 min

Для EF6:

DbContext db = ...;
db.Database.CommandTimeout = 120; // 2 min

Но похоже, что вы используете Dapper . Используемый метод Query<T> в настоящее время имеет следующую подпись:

public static IEnumerable<T> Query<T>(
    this IDbConnection cnn,
    string sql,
    object param = null,
    IDbTransaction transaction = null,
    bool buffered = true,
    int? commandTimeout = null,
    CommandType? commandType = null
)

Как видите, множество необязательных параметров, и один из них - commandTimeout, который вам нужен. Таким образом, вы можете использовать что-то вроде этого:

var entities = connection.Query<T>(Query, commandTimeout: 120);

Или вы можете установить время ожидания по умолчанию для всех запросов:

SqlMapper.Settings.CommandTimeout = 120; // 2 min
0 голосов
/ 30 августа 2018

Похоже, что запрос занимает более 60 секунд. Установите его как 0 (бесконечно) и проверьте.

connection.ConnectionTimeout = 0;

Наиболее распространенный способ сделать это - использовать свойство CommandTimeout объекта SqlCommand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...