当前位置: 首页 > 面试题库 >

EF DBContext处理不关闭连接

宰父正真
2023-03-14
问题内容

我正在使用EF 6.1.0

我在下面将自定义DBContex对象作为DBEntites

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; }
}

我对上下文对象执行以下操作

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;
        }

但是在放置上下文对象之后,我仍然可以看到一个活动的数据库连接。在连接状态下,我可以看到该连接已经关闭(该连接从未为真)。

我正在使用以下查询来查看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

在下面的语句中,增加了sql连接计数。但是即使处置了它也从未失败过。(我的意思是在使用块计算后,它应该关闭连接)。

var res = entitySet.Where<T>(predicate).ToList();

任何帮助将不胜感激。


问题答案:

正如评论中指出的那样,其原因确实是.NET执行的连接池。出于性能方面的原因,.NET会为您在应用程序中使用的每个连接字符串维护一个连接池(因为打开和关闭连接在性能方面通常可能会很昂贵)。该池具有一定的最小和最大大小(由MinPoolSizeMaxPoolSize连接字符串参数控制)。当您打开一个连接(通过SqlConnection.Open)时-它可能会从池中移出,而实际上并没有重新打开。当您关闭连接时(也可以通过布置EF上下文来完成)-连接可能会改为放入池中,并没有真正关闭。如果连接空闲了一定时间(大约5分钟),则可能会将其从池中删除。

如果(出于某种原因)想要避免这种情况,可以将连接字符串的MaxPoolSize设置为0,或者通过SqlConnection.ClearPool或显式清除池SqlConnection.ClearAllPools



 类似资料:
  • 问题内容: PHP中是否可以关闭连接(本质上告诉浏览器没有更多数据可用)但是可以继续处理。我正在考虑的特定情况是,我想提供缓存的数据,然后,如果缓存已过期,我仍然会提供缓存的数据以快速响应,关闭连接,但继续进行处理以重新生成并缓存新的数据数据。本质上,唯一的目的是使网站显得更具响应性,因为在用户等待内容重新生成时不会偶尔出现延迟。 更新: PLuS对我一直在寻找最接近的答案。为了澄清几个人,我正在

  • 问题内容: 我试图了解哪些是应用程序的“物理”限制。 在客户端: 在服务器端: 在OSX中达到文件限制(256)时,统计信息如下 让我感到困惑的是: 如果我强行关闭连接(这是我想对客户端执行的操作,为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)? 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可

  • 我使用Java应用程序前端与MySQL 5.6服务器上的数据库进行连接和交互。使用MySQL的JDBC连接器时,我遇到了连接到服务器的问题,当连接失败时,服务器没有关闭。调用close()。但当应用程序关闭时,所有连接都会断开。下面是用于进行查询的dao类。 接下来的代码是使用数据库验证应用程序用户的方法。有一些System.out.println()语句在整个过程中跟踪con变量。 运行该方法的

  • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

  • 我正在Eclipse中的一个Java项目中工作,该项目有一个扩展PApplet以运行处理草图的类。 首先,我有一个JFrame登录屏幕,在用户登录后,我调用 开始素描。 现在,当游戏结束时,我想关闭草图窗口,但不是原来的JFrame窗口。 通常我会打电话 但这会关闭整个应用程序(即所有窗口)。 我也试过了 但这没什么用。 我想我在找 但对于帕普莱来说。

  • 这个问题似乎不是关于特定的编程问题、软件算法或主要由程序员使用的软件工具。如果您认为这个问题在另一个Stack Exchange网站上是主题,您可以留下评论来解释这个问题在哪里可以得到回答。 我们构建了一个定制的Kafka Connect sink,它反过来调用一个远程REST API。我如何将背压传播到Kafka Connect基础设施,以便在远程系统比内部使用者向put()传递消息慢的情况下,