我们目前正在调查一个问题,根据防火墙提供商的说法,我们有时会打开大约1500个并行会话。我强烈怀疑,我们的TFS-Replication是一种服务,它通过TFS对象模型从外部TFS获取工作项并将一些数据保存到本地SQL数据库中,这导致了这个问题。
对对象模型的访问如下所示:
internal static async Task<IReadOnlyCollection<WorkItem>> QueryWorkItemsAsync(string wiqlQuery)
{
var tfsConfig = TFSConfiguration.Instances[Constants.TfsPrefix.External];
var uri = new Uri(tfsConfig.WebbaseUri);
var teamProject = new TfsTeamProjectCollection(uri, new VssBasicCredential(string.Empty, ConfigurationManager.AppSettings[Infrastructure.Constants.APP_SETTINGS_TFS_PAT]));
var workItemStore = teamProject.GetService<WorkItemStore>();
var query = new Query(workItemStore, wiqlQuery, null, false);
var result = await Task.Run(
() =>
{
var castedWorkItems = query.RunQuery().Cast<WorkItem>();
return castedWorkItems.ToList();
});
return result;
}
没什么太花哨的:可以将WIQL传递给方法。目前,我正在获取块,因此WIQL看起来像
var wiql = "SELECT * FROM WorkItems";
wiql += $" WHERE [System.Id] > {minWorkItemId}";
wiql += $" AND [System.Id] <= {maxWorkItemId}";
wiql += " ORDER BY [System.Id] DESC";
我几乎没有对这个WorkItems做任何事情,除了映射他们的一些字段,但不写,保存或任何东西。我没有得到关于我正在使用的关于打开Sessions的对象的任何暗示,并且WorkItem-Objects本身只是非常短暂地存在于内存中。
我在这里遗漏了什么,可以解释该服务中的公开会话吗?
答案 0 :(得分:2)
客户端对象模型做了很多事情:
TFSTeamprojectCollection类实现IDisposable,必须偶尔清理一次以确保连接关闭。在内部缓存中进行维护,但它确保连接已关闭。
将此代码包装在try / catch块中或通过依赖注入提供Team Project Collection并在更高级别管理连接可能是个好主意(否则您的其他字段将无法填充)。
答案 1 :(得分:1)
我不知道工作项目背后的细节,但我发现当你在wiql的选择中指定只有几个字段,你仍然可以访问其他字段......而且这是相当慢的。如果我选择后来通过索引器访问的所有字段,它会快得多。 从那个观察我会说:是的,沟通是开放的。