对于具有很多记录的查询,我遇到了超时问题。如何更改查询超时?
我尝试以这种方式更改超时连接,但这不起作用:
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();
}
}
}
}
答案 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>