今天,当我从下面的代码
运行我的应用程序时,我遇到了异常dbContext.ManageTasks.Where(x => x.IsDeleted == false).ToList();
错误是
超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
我从这次讨论中得到了一个解决方案:How can I solve a connection pool problem between ASP.NET and SQL Server?
解决方案:如果我关闭当前连接字符串对象,则此错误将消失。
SqlConnection myConnection = new SqlConnection(ConnectionString);
myConnection.Open();
// some code
myConnection.Close();
上面的ADO.NET代码,而不是实体框架。
如何关闭Entity Framework中的连接字符串对象?
答案 0 :(得分:4)
您可能在班级的某个地方保留了一个全局变量dbContext
。你不应该这样做!
您可以使用IDisposable
实现的DbContext
接口并使用using
语句。您可以在需要时初始化新的DbContext
:
using (YourDbContext dbContext = ...)
{
// do some actions
}
// context will be closed
使用using
的好处是它会关闭并处理掉,即使里面的代码会抛出异常。
答案 1 :(得分:3)
我有点不确定为什么你需要使用" SqlConnection"。 DbContext是一个一次性类。我发现最安全的清理方法是使用"使用"标签。 E.g。
using(DbContext _context = new MyContext())
{
\\Your Work here
}
当它到达结束大括号时会自动调用_context.Dispose(),这实际上会关闭你的连接。
替代方案是:
DbContext _context = new MyContext();
_context.ManageTasks.Where(x => x.IsDeleted == false).ToList();
_context.Dispose();
这意味着如果发生异常,可能会错过处理调用。
希望这有帮助。
为了处理事务范围并帮助处理对象,您可能需要查看存储库模式和unitOfWork模式。或both。