在多线程数据库连接上获得大量超时

时间:2016-07-14 22:42:20

标签: c# multithreading postgresql

我有一个程序在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));

在每个线程的开头,我得到的时间更少,所以我觉得这是建立连接的时间问题,但这是不可靠的。

非常感谢任何帮助。

由于

0 个答案:

没有答案
相关问题