2017-04-13 36 views
3

如果我运行下面的代码,很多到数据库的连接仍然没有任何作用。您可以通过运行检查开连接数:Codefluent:在线程结束后数据库连接仍然存在

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

或者,如果你想了解更多详细运行以下命令。你会看到很多连接用“命令等待”状态:

sp_who2 

我都会以为,后退出线程,并关闭了连接Codefluent持久性方面也就不复存在了。我如何强制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(); 
+0

可能这是由于某种形式的连接池? –

+0

我这么认为,Codefluent每个线程使用一个连接。但是,如果线程不见了,为什么连接仍然存在? –

+0

请注意,我不熟悉CodeFluent。但数据库连接池通常会尝试通过保持非活动连接并重用它们来避免创建和打开数据库连接的相对昂贵的(时间)过程。 –

回答

0

Meziantou回答我的问题,但提到过载不存在。 下面的代码应该诀窍:

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

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

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

我发现'Constants.SoftFluent_RowShareStoreName'在我们的例子中是%ApplicationNamespace%.Constants。%ApplicationNamespace%StoreName –

+0

恐怕这并不能解决问题。如果在返回之前在我的测试代码中添加以下行,我仍然会获得1000个额外的打开连接。 CodeFluent.Runtime.CodeFluentContext.GetExisting(Compareware.Constants.ComparewareStoreName)?.的Dispose(); –

+0

唯一能做的就是CodeFluent.Runtime.CodeFluentContext.GetExisting(Compareware.Constants.ComparewareStoreName)?. Persistence.ResetConnection(); 也许.Dispose方法不完整? –