C# 即使I';我正在调用Connection.Close()

C# 即使I';我正在调用Connection.Close(),c#,sql,linq-to-sql,C#,Sql,Linq To Sql,我有一个线程(通过new-thread(new-ThreadStart(…))调用),它在我的软件运行时总是在运行,在数据库中进行轮询 以一种非常简单的方式,它基本上实现了以下功能: void Polling() { Thread.Sleep(500); methodA(); if (certainTimePassed) methodB(); if (anotherCertainTimePassed) methodC();

我有一个线程(通过
new-thread(new-ThreadStart(…)
)调用),它在我的软件运行时总是在运行,在数据库中进行轮询

以一种非常简单的方式,它基本上实现了以下功能:

void Polling()
{
    Thread.Sleep(500); 
    methodA();
    if (certainTimePassed)
        methodB();
    if (anotherCertainTimePassed)
        methodC();
    ...
}

void methodA()
{
    SIDataContext db = new SIDataContext(_host.Config.ConnectionString);
    if (looksForSomeData())
        raiseSomeEvents();
    db.Connection.Close();
}
它的运行时间越来越长。但是,如果我通过使looksForSomeData()返回始终为真(即不断插入它搜索的数据)来强调应用程序,同时使用另一个在数据库中查询大型选择的软件部件,它最终会产生以下结果(始终使用MethodA,可能是因为它是调用最多的一个):

超时已过期。获取数据之前经过的超时时间 来自池的连接。发生这种情况的原因可能是所有的 连接正在使用,已达到最大池大小

我认为这可能是更复杂的问题。但由于我只有几个月的LINQs DataContext()经验,所以我不确定

注意事项/我尝试过:

  • 使用
    而不是
    db.Connection.Close()
  • 它无法打开连接、引发异常和不关闭连接,因为如果在此线程中引发异常,软件将退出
  • raiseSomeEvents()
    中引发的事件不会累积(可能),因为存在某种信号量解决方案,使得在事件尚未运行时引发事件
  • 捕获异常而不执行任何操作。软件速度减慢,甚至冻结了一段时间,然后恢复正常(似乎连接最终被释放)

我非常感谢能够帮助我诊断问题所在的一切。可能只是连接池。启动新连接的成本非常高,因此.Net将保持连接打开并重新使用它们。

您的表上有索引吗?大量插入还会导致索引更新,这可能会对select语句产生不利影响。此外,select语句还可能使用temp数据库来确保它们是可重复的,这也是一种昂贵的方法。这些可能会产生累积影响,推高完成快速操作所需的时间。请查看您的
methodA()
,并告诉我如果在创建数据上下文后但在关闭之前引发异常或中止线程,您认为会发生什么情况?正确的答案是连接将保持打开状态,至少一段时间

必须将与数据库访问有关的任何内容封装在
try
/
finally
块中,以便连接作为
finally
的一部分关闭。最简单的方法是使用
块。我知道你说过你试过了,但你应该发布代码:

void methodA()
{
    using (SIDataContext db = new SIDataContext(_host.Config.ConnectionString))
    {
        if (looksForSomeData())
            raiseSomeEvents();
    }
}

在我看来,您的查询运行时间异常(即超过10-15秒)。在这些情况下,连接可能会超时。我建议您尝试使用应用程序可能传递的任何参数自行运行查询,如果查询需要很长时间,请查看是否有任何方法可以改进SQL


您始终可以引用以下内容:

您确定连接正在泄漏,还是在池已满时请求连接?如果关闭连接所需的时间过长,则可能会发生这种情况。我不确定它们是否泄漏,我只是认为是由于异常,所以这是一种可能性,我将进行调查。是否可能有时会抛出并捕获异常?如果发生异常,您的代码不会关闭连接(提示:使用“using”)@我查过了。实际上,我以前使用过
,并改为显式连接.Close()来解决这个问题。@AndréSantalódatabase blocking;sp_who2等即使我一直在调用Connection.Close()?这是正确的。连接池不会关闭基础连接。这很有趣。我想我对连接池知之甚少,我会读到它。我会把它作为答案,因为问题是。。。我的线程运行得越多,连接池就越大。我是通过调试和运行sp_who2发现这一点的。@AndréSantaló,请自己回答,而不是。