在我的多线程 Windows 服务中,我在每个线程上打开与数据库的连接,然后处理这些连接,但问题是当我对 sys.sysprocesses 表执行查询时,有些连接没有在数据库上关闭。
我运行了两个单元测试并看到了一些奇怪的行为,首先我运行了一个包含 100 个任务的循环,并且在每个任务中我都打开了一个新连接。这些完成后(我通过 WaitAll() 看到)我看到一些连接仍然挂在数据库中。在第二个单元测试中,当我在没有并行执行的情况下运行几个 open/dispose 时,它会很好地处理它们并且我的数据库中没有挂起的连接。
问题是,在我的 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();
}
谢谢