在我的多线程Windows服务中,我在每个线程上打开与数据库的连接,然后释放这些连接,但问题是当我在sys.sysprocesses表上执行查询时,有一些连接没有关闭。
我运行了两个单元测试并观察到一些奇怪的行为。在第一个测试中,我运行了带有100个任务的循环,在每个任务中都会打开一个新的连接。在所有任务完成后(通过WaitAll()观察),我发现有些连接仍然挂在数据库中。而在第二个单元测试中,当我进行多个打开/释放操作而不是并行执行时,它们被正常释放了,我的数据库中也没有挂起的连接。
问题在于,在我的Windows服务中,这些挂起的连接会累加,并且最终没有更多的空间提供给用户,导致无法使用数据库。
以下是代码,第一个是并行的,第二个则不是:
我运行了两个单元测试并观察到一些奇怪的行为。在第一个测试中,我运行了带有100个任务的循环,在每个任务中都会打开一个新的连接。在所有任务完成后(通过WaitAll()观察),我发现有些连接仍然挂在数据库中。而在第二个单元测试中,当我进行多个打开/释放操作而不是并行执行时,它们被正常释放了,我的数据库中也没有挂起的连接。
问题在于,在我的Windows服务中,这些挂起的连接会累加,并且最终没有更多的空间提供给用户,导致无法使用数据库。
以下是代码,第一个是并行的,第二个则不是:
[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();
}
谢谢