private void NpgSqlGetContracts(IList<Contract> con)
    {
        var conn = (NpgsqlConnection)Database.GetDbConnection();

        List<Contract> contracts = new List<Contract>();

        using (var cmd = new NpgsqlCommand("SELECT * FROM \"Contracts\";", conn))
        {
            cmd.CommandTimeout = 1;

            cmd.Prepare();

            int conCount= cmd.ExecuteNonQuery();

            using (var reader = cmd.ExecuteReader(CommandBehavior.SingleResult))
            {
                while (reader.Read())
                {
                    contracts.Add(MapDataReaderRowToContract(reader));
                }
            }
        }
    }

Здесь у меня есть этот код, чтобы попробовать тайм-аут команды в postgres, я попытался отладить его локально с точкой останова в Visual Studio. Я пробую как ExecuteNonQuery, так и ExecuteReader. Запрос занял более 1 секунды для загрузки всех данных (у меня здесь более 3 миллионов строк). Но тайм-аут команды установлен на 1 секунду. Интересно, почему здесь не возникает никаких исключений, что я здесь неправильно настроил?

Спасибо :)

1
Jan Nutcha 8 Фев 2021 в 15:40

1 ответ

Лучший ответ

Как писал @ hans-ke sting выше, тайм-аут команды не суммируется для всей команды, а скорее для каждого отдельного вызова, производящего ввод-вывод (например, Read). В этом смысле он предназначен для помощи с запросами, выполняющимися слишком долго (без каких-либо результатов), или с проблемами сети.

Вы также можете взглянуть на statement_timeout < / a>, который является таймаутом на стороне PG для всей команды. У него тоже есть свои проблемы, и Npgsql никогда не устанавливает его неявно для вас, но вы можете установить его самостоятельно.

2
Shay Rojansky 8 Фев 2021 в 15:30