我们一直在生产服务器中收到此错误。
从池中获取连接之前经过的超时时间。这可能是因为所有池化连接都在使用中并且达到了最大池大小
这是我从数据库中读取的方式
objDataEngine.InitiateConnectionAsync();
SqlParameter[] Parameters = new SqlParameter[3];
...
var execResult = await objDataEngine.ExecuteCommandAsync("WebBrandListSelect", CommandType.StoredProcedure, Parameters);
while (execResult.Read())
{
//read from datareader
}
objDataEngine.CloseConnection();
InitiateConnectionAsync的代码是:
public async Task InitiateConnectionAsync()
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = ConfigurationManager.AppSettings[this.database];
builder.InitialCatalog = this.database;
builder.UserID = this.username;
builder.Password = this.password;
Connection.ConnectionString = builder.ConnectionString;
await Connection.OpenAsync();
}
ExecuteCommandAsync
public async Task<SqlDataReader> ExecuteCommandAsync(string commandText, CommandType type, SqlParameter[] parameters = null)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 400;
cmd.Connection = Connection;
cmd.CommandType = type;
cmd.CommandText = commandText;
cmd = AssignParameters(cmd, parameters);
SqlDataReader Reader =await cmd.ExecuteReaderAsync();
this.ObjReader = Reader;
this.ObjSqlCommand = cmd;
return Reader;
}
最后是CloseConnection
public void CloseConnection()
{
this.Connection.Close();
this.Connection.Dispose();
if (this.ObjReader!=null)
{
this.ObjReader.Close();
this.ObjReader.Dispose();
this.ObjReader = null;
}
if (this.ObjSqlCommand!=null)
{
this.ObjSqlCommand.Dispose();
}
}
如果您的代码中发现任何错误,请提供帮助。我的datareader是否有可能没有妥善处置?
答案 0 :(得分:1)
连接上有一个连接超时属性,它与命令超时无关,因此可能值得尝试设置它。您可以在代码或连接字符串中设置它,如果您使用的是SQL / Server,则在连接字符串中将其称为“Connect Timeout =”。
我已经快速查看了您的代码 - 我对处理连接然后处理读取器和命令感到不安。我认为你应该按顺序处理命令,阅读器和连接,虽然我通常不会使用处理代码,除非我有理由 - 垃圾收集器通常对于许多场景都足够好。
如果这没有帮助,我会查看系统配置选项,例如连接池大小等。