Intereting Posts
Как присоединиться к двум запросам с различным количеством записей и столбцов в Oracle? Вернуть несколько полей в качестве записи в PostgreSQL с помощью PL / pgSQL SQL Сколько сотрудников работает, группа за часом SQL запрашивает диапазон записей, которые попадают в значение Min и Max Возвращать результаты запроса на основе сегодняшней даты в SQL (MySQL) Round to .5 или 1.0 в SQL Геометрия SQL находит все точки в радиусе лучший способ хранения url в mysql для приложения чтения и записи SQLite – оптимизация общей совокупности предыдущих строк с несколькими условиями Дата Java – вставка в базу данных Django prefetch_related с лимитом Заполнение данных на основе столбцов в другой таблице DB2: как проверить дату в формате String, который является типом данных varchar Каковы некоторые хорошие способы переноса данных в таблице SQL из строк-столбцов в столбцы-столбцы? получить строку с наибольшим значением в MySQL

Обнаружение и обработка, когда запрос базы данных идет не так

Моя проблема в том, что я хочу, чтобы все мои запросы возвращали результаты через ограниченное время. AFAIK, postgres имеет 2 варианта для этого: connect_timeout при открытии соединения с базой данных и statement_timeout для запроса.

Это приводит к двум проблемам:

  1. Я должен оценить время выполнения запроса. Мой подход настроен на худший сценарий: с предустановленной полосой пропускания на сервер db, запрос с большим количеством записей … чтобы определить его, но я думаю, что это не разумный способ. Есть ли лучшие идеи / шаблоны … чтобы справиться с этим?

  2. Сетевая проблема. Предположим, что сеть плоха с тяжелыми потерями пакетов, высоким пингом, как черт … запрос от клиентов, и результат с сервера застрял … Конечно, мы можем установить тайм-аут из кода, но я думаю, что это будет сложный из-за ресурсов обработки и других вещей, и он дублируется с механизмом таймаута базы данных. В любом случае, чтобы справиться с этим?

Другая версия истории: когда запрос занимает много времени, я хочу отличить: этот запрос хорош, просто слишком много записей, дождитесь его, и нет, запрос «сломан», не ждите Это…

Ps: Я нашел эту ссылку, но это для SQL Server 2005 🙁

http://www.mssqltips.com/sqlservertip/1338/finding-a-sql-server-process-percentage-complete-with-dmvs/

Как вы уже упоминали, трудно предсказать, как долго выполняется запрос (из-за самого запроса и его параметров из-за сети из-за нагрузки на сервер).

В любом случае вы должны переместить SQL-запросы в QThreads. Это позволяет вашему приложению обслуживать графический интерфейс пользователя во время выполнения запросов.

Также я бы не стал пытаться решить это таймаутами. Вы столкнетесь с множеством проблем, потому что вам не удастся выбрать правильные тайм-ауты для каждого запроса и каждой ситуации. Вместо этого предоставьте способ отмены запросов кнопкой или диалоговым окном, чтобы пользователь мог решить, разумно ли продолжать или нет.

Что ты хочешь делать:

когда запрос занимает много времени, я хочу отличить: этот запрос хорош, просто слишком много записей, дождитесь его, и нет, запрос «сломан», не ждите его.

просто не получится. Кажется, вам требуется решение проблемы с остановкой , что является принципиально сложной проблемой в информатике.

Вы должны решить, сколько времени подходит для запуска запроса, и установите тайм-аут. Нет надежного способа предсказать, как долго он должен запускаться, за исключением того, что посмотрел, как долго выполнялись другие подобные запросы. Также нет способа рассказать разницу между правильным (но медленным) запросом и тем, который будет работать вечно. Это особенно верно, когда задействованы такие функции, как WITH RECURSIVE или PL / PgSQL.

Вы можете делать запросы в определенном классе, объект которого находится в отдельном потоке, и дождаться истечения времени ожидания для завершения объекта:

 databaseObject->performQuery(); QThread * th = databaseObject->thread(); th->quit(); th->wait(2000); if(th->isRunning()) { th->terminate(); return false; } else return true;