在我的多線程的Windows服務中,我在每個線程上打開數據庫的連接,然後我處理這些連接,但問題是當我執行查詢時,某些數據庫沒有關閉sys.sysprocesses表。線程的實體框架連接管理
我運行了兩個單元測試,看到了一些奇怪的行爲,首先我運行了一個有100個任務的循環,並在其中的每個人中打開一個新的連接。這些完成後(我通過WaitAll()看到),我看到一些連接仍然掛在數據庫中。 在第二次單元測試中,當我運行多個open/dispose而沒有並行執行時,它將它們處理得很好,並且在我的db中沒有掛起的連接。
問題是,在我的Windows服務中,這些掛起的連接正在被加起來,並且最終沒有更多的地方用於新的連接,並且db變得對用戶不可用。
這裏有代碼,第一個是平行的,第二個是不是:
[TestMethod]
public void TestMultiThreadedAccessToExplicitObjectContext()
{
int taskSize = 100;
List<Task> taskList = new List<Task>();
int goodSources = 0;
for (int i = 0; i < taskSize; i++)
{
Task newTask = Task.Factory.StartNew(() =>
{
System.Data.Objects.ObjectContext objectContext = new PersoniteEntities();
objectContext.Connection.Open();
objectContext.Dispose();
Thread.Sleep(1200);
});
taskList.Add(newTask);
}
Task.WaitAll(taskList.ToArray());
GC.Collect();
total += goodSources;
}
[TestMethod]
public void TestMultiThreadedAccessToExplicitObjectContextInline()
{
System.Data.Objects.ObjectContext objectContext1 = new PersoniteEntities();
objectContext1.Connection.Open();
objectContext1.Dispose();
System.Data.Objects.ObjectContext objectContext2 = new PersoniteEntities();
objectContext2.Connection.Open();
objectContext2.Dispose();
System.Data.Objects.ObjectContext objectContext3 = new PersoniteEntities();
objectContext3.Connection.Open();
objectContext3.Dispose();
System.Data.Objects.ObjectContext objectContext4 = new PersoniteEntities();
objectContext4.Connection.Open();
objectContext4.Dispose();
System.Data.Objects.ObjectContext objectContext5 = new PersoniteEntities();
objectContext5.Connection.Open();
objectContext5.Dispose();
}
感謝
這不是EF事情,也不是TPL事情。這是由於[連接池](http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) – Aron