【发布时间】:2021-06-11 15:08:28
【问题描述】:
在生产过程中,我的日志文件中突然出现此错误:
System.Web.HttpException (0x80004005):引发了“System.Web.HttpException”类型的异常。
System.Web.HttpException (0x80004005):无法连接到 SQL Server 会话数据库。
System.InvalidOperationException:超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。
我看了很多其他答案,比如here
但我没有连接泄漏,我不想只将最大池设置为 200左右因为我想了解为什么我突然得到这个异常......
这些是我的连接字符串:
<!--Nhibernate-->
<add name="name"
connectionString="Server= servername;Initial Catalog=DBname;UID=username;Password=password;MultipleActiveResultSets=true"
providerName="System.Data.SqlClient" />
<!--Entity Framework-->
<add name="name"
connectionString= "metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=servername;initial catalog=DBname;user id=userName;password=password;multipleactiveresultsets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
更新
一个使用db没有连接泄漏的例子:
using (var db = new dbName())
{
using (var connection = db.Database.Connection)
{
var command = connection.CreateCommand();
...
connection.Open();
using (var reader = command.ExecuteReader())
{
...
reader.NextResult();
...
reader.NextResult();
...
reader.NextResult();
...
}
connection.Close();
}
}
更新
事实证明,我在 Entity Framework 中确实有连接泄漏,
一个没有使用using的地方,连接也没有关闭!
例子:
private DbContext context = new DbContext();
...
List<dbObject> SeriesEvents = context.dbObject.Where(e => e.RecurrenceId == entity.RecurrenceId).ToList();
context 变量未关闭。
我更重要的是,这个查询做了很多数据库查询,超过了 100 个。
【问题讨论】:
-
让我们看看应该是
don't have connections leak我敢打赌你没有正确处理的代码 -
@Charlieface 你错了,我处理得当。我会更新一个例子
-
db.Database.Connection属性的实现是什么样的?连接确实返回了正确的DbConnection,对吗? -
发生错误时您在 SQL Server 中有多少个连接?在任何给定时间,您在该 Sql Server 上是否有超过 32,000 个连接?
-
该 sql server 是在同一个机器上运行还是在单独的服务器上运行?网络服务器/客户端运行的操作系统是什么? nHiberbate 上下文是否有可能泄漏连接而不是这个 EF 连接?它是否会在创建连接的多个位置或始终在代码中的相同方法处引发此异常?
标签: c# sql-server database connection-string connection-pooling