今天,当我从以下代码运行我的应用程序时,我遇到了异常
dbContext.ManageTasks.Where(x => x.IsDeleted == false).ToList();
错误是
超时已过期。从池获取连接之前经过的超时期限。这可能是因为所有池连接都在使用中,并且已达到最大池大小。
我从这个讨论中得到了一个解决方案:如何解决 ASP.NET 和SQL Server之间的连接池问题?
解决方案是:如果我关闭当前连接字符串对象,那么此错误将消失。
SqlConnection myConnection = new SqlConnection(ConnectionString);
myConnection.Open();
// some code
myConnection.Close();
上面的代码用于 ADO.NET,而不是实体框架。
如何在实体框架中关闭连接字符串对象?
我有点不确定为什么你需要使用"SqlConnection"。DbContext 是一个一次性类。我发现最安全的清理方法是使用"using"标签。例如
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 模式。或两者兼而有之。
此外,我知道使用依赖注入来处理很多连接。我只是确保它们是作用域(每个 Web 请求):)
您可能在类中的某个地方保留了一个全局变量dbContext
。你不应该那样做!
您可以使用DbContext
实现的 IDisposable
接口并使用 using
语句。您可以在需要时初始化新DbContext
:
using (YourDbContext dbContext = ...)
{
// do some actions
}
// context will be closed
使用 using
的好处是它会关闭和释放,即使里面的代码会引发异常。