Cha*_*han 12 c# sql sql-server entity-framework
我使用的是EF 6.1.0
我在DBEntites下面有自定义DBContex对象
public partial class DbEntities : DbContext
{
public DbEntities()
: base("name=DbEntities")
{
////Configuration.LazyLoadingEnabled = true;
////Configuration.ProxyCreationEnabled = false;
}
//// I have ALL Entites added as below
////public virtual IDbSet<CCode> CCodes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在上下文对象上有以下操作
using (var context = new DbEntities())
{
var entitySet = context.Set<T>();
var res = entitySet.Where<T>(predicate).ToList();
if (context.Database.Connection.State == ConnectionState.Open)
{
context.Database.Connection.Close();
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
但在处置上下文对象后,我仍然可以看到活动的数据库连接.在连接状态条件下,我可以看到连接已经关闭(连接从未成立).
我使用以下查询来查看SQL上的连接.
select db_name(dbid) , count(*) 'connections count'
from master..sysprocesses
where spid > 50 and spid != @@spid
group by db_name(dbid)
order by count(*) desc
Run Code Online (Sandbox Code Playgroud)
在下面的语句中,sql连接数增加了.但即使在处置后它也从未停止过.(我的意思是在使用块之后,它应该关闭连接).
var res = entitySet.Where<T>(predicate).ToList();
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
Evk*_*Evk 16
正如评论中所指出的那样,原因确实是由.NET执行的连接池.由于性能原因,.NET为您在应用程序中使用的每个连接字符串维护一个连接池(因为打开和关闭连接通常可能在性能方面成本很高).该池具有一定的最小和最大尺寸(由控制MinPoolSize和MaxPoolSize连接字符串参数).当你打开一个连接(通过SqlConnection.Open) - 它可能会从池中取出而不是真的重新打开.当您关闭连接时(也通过处理EF上下文完成) - 连接可能会被放入池中,而不是真正关闭.当连接空闲一段时间(大约5分钟)时 - 它可能会从池中删除.
如果您(由于某种原因)想要避免这种情况,您可以将MaxPoolSize设置为0以表示连接字符串,或者通过SqlConnection.ClearPool或显式清除池SqlConnection.ClearAllPools.
| 归档时间: |
|
| 查看次数: |
8733 次 |
| 最近记录: |