2017-04-13 57 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方法不完整? –