首页 > 解决方案 > 如何更改查询超时

问题描述

对于有很多记录的查询,我有超时问题。如何更改查询超时?

我尝试以这种方式更改超时连接,但它不起作用:

连接.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();
            }
        }
    }
}

标签: c#sqlentity-framework

解决方案


您需要设置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

推荐阅读