我有一个程序在5个不同的数据库上运行一系列命令到同一台服务器。它是线程化的,每个线程创建一个新连接,运行查询并将结果放入一个线程安全集合,该集合由另一个应用程序提取。这个程序可以工作并完成它的所有目的,但是我得到了很多连接超时。
Parallel.ForEach(NodeList, new ParallelOptions() { MaxDegreeOfParallelism = 15, CancellationToken = CancelToken.Token }, node => {
using (CancellationTokenSource cancel = CancelToken.Token.CreateLinkedSource()) {
while (true) {
node.Attempts++;
try {
using (NpgsqlConnection conn = new NpgsqlConnection(node.ConnectionString)) {
conn.Open();
using (NpgsqlCommand npgQuery = new NpgsqlCommand(node.Query, conn)) {
cancel.Token.Register(() => {
npgQuery.Cancel();
});
npgQuery.Prepare();
using (NpgsqlDataReader reader = npgQuery.ExecuteReader()) {
while (reader.Read()) {
Row row = new Row();
for (int i = 0; i < reader.FieldCount; i++) {
row.AddColumn(reader.GetName(i), reader.GetFieldType(i), reader.GetValue(i));
}
Producer.Add(row);
}
}
}
break;
}
} catch (Exception e) {
if (node.Attempts >= RetryAttempts) {
break;
}
}
}
}
});
这是我的线程连接下载的胆量。每个Node实例都有一个连接字符串,用于指定Pooling = false和一个不相关的查询。
数据库的连接限制为200,我从未见过它超过30,所以这不是问题。
如果我添加:
Thread.Sleep(random.Next(50, 1500));
在每个线程的开头,我得到的时间更少,所以我觉得这是建立连接的时间问题,但这是不可靠的。
非常感谢任何帮助。
由于