如何更改查询超时

时间:2018-08-30 11:29:02

标签: c# sql entity-framework

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

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

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 :(得分:5)

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

答案 1 :(得分:0)

看起来查询耗时超过60秒。将其设置为0(无限)并检查。

connection.ConnectionTimeout = 0;

大多数可接受的方法是通过SqlCommand对象的CommandTimeout属性。

答案 2 :(得分:0)

如果超时是只读的,则意味着您已经以其他方式连接到数据库,可以对其进行更改。 尝试在连接字符串中设置超时时间,这可能有助于更好地组织代码。

 <connectionStrings>  
    <... connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>