Codefluent:线程结束后仍保留与数据库的连接

时间:2017-04-13 18:47:34

标签: c# codefluent

如果我运行下面的代码,很多与数据库的连接仍然无效。您可以通过运行来检查打开的连接数:

SELECT COUNT(dbid) as TotalConnections FROM sys.sysprocesses WHERE dbid > 0

或者,如果您想要更多细节,请运行以下命令。你会看到很多与'AWAITING COMMAND'状态的联系:

sp_who2

我会假设在线程退出并关闭连接后,Codefluent Persistency上下文将消失。如何强制Codefluent关闭池中的连接?

public void TestThreads()
{
    for (var i = 0; i < 1000; i++)
    {
        var t = new Thread(() => StaticticThreadContainer.Test());
        t.Start();
    }
}

public static int Test()
{
   var p = CwObject.LoadByEntityKey("baf04c09-7415-497d-b3cd-00004266f503");
   return 1;
 }

我发现了一点。如果我在返回线程之前调用以下代码,则连接将正确关闭。这是要走的路吗?

CodeFluentContext.Get(Compareware.Constants.ApplicationStoreName).Persistence.ResetConnection(); 

2 个答案:

答案 0 :(得分:0)

CodeFluent实体使用LocalDataStoreSlot存储每个线程的上下文。当线程终止时,线程本地数据不会自动处理。 因此,在终止线程之前,您必须调用Dispose方法:

CodeFluent.Runtime.CodeFluentContext.GetExisting(Constants.MyStoreName)?.Persistence.Dispose(true);

答案 1 :(得分:0)

Meziantou回答了我的问题,但提到的超载不存在。 以下代码应该可以解决问题:

CodeFluent.Runtime.CodeFluentContext.GetExisting(Constants.MyStoreName)?.Persis‌​tence.ResetConnectio‌​n();
CodeFluent.Runtime.CodeFluentContext.GetExisting(Constants.MyStoreName)?.Persistence.Dispose();