2015-10-02 3 views
1

Итак, я узнал, что создать непрозрачную задачу для SQL-запросов не совсем просто. Поэтому я попытался придумать альтернативное решение, чтобы указать, когда будет выполнена задача. Я решил, что могу потратить время на выполнение одного запроса в базе данных, а затем использовать эту информацию для создания оценки в зависимости от количества запросов, которые необходимо выполнить, а затем создать индикатор выполнения этой информации. Я знаю, что это не будет на 100% надежное решение, потому что, если что-то пойдет не так, оно все равно покажет индикатор выполнения, но, по крайней мере, даст пользователю некоторое указание, когда работа будет выполнена, вместо того, чтобы просто иметь загрузочный счетчик.Progressbar в SQL

Есть ли лучшее решение этой проблемы?

редактировать, чтобы ответить на некоторые вопросы

Это функция обновления, которая занимает много времени. У меня есть 15.000 входных данных в базе данных, и я должен обновить все 15.000 через API. Поэтому сначала я должен вытащить идентификатор всех этих пользователей и использовать их с API для получения обновленной информации, а затем я должен выполнить все 15 000 запросов с обновленной информацией. Все это требует времени. Я сомневаюсь, что это можно сделать быстро. С базой данных из 15 000 запросов мне потребовалось около 2 часов. Я не считаю, что счетчик в течение 2 часов без указания того, когда это будет сделано, является реальным. Мне нужна какая-то оценка.

Обратите внимание, что обновление базы данных - это то, что будет сделано очень редко. Например, может быть, раз в неделю пользователь будет обновлять базу данных.

+1

Я полагаю, вы уже видели этот http://stackoverflow.com/a/617271/2042240 – nowhere

+0

Вы сказали это сами - это не надежное решение. Разве не лучше сообщить пользователю, что задача выполняется, и просто указать, что она продолжается? Баланс прогресса просто путает пользователей, и это - метрическая тонна работы, чтобы вы могли заставить ее работать. Вы даже не можете оценить, сколько времени может потребоваться запрос. Я просто создаю визуальный уведомитель о том, что что-то сделано, без блокировки всего пользовательского интерфейса. – Mjh

+1

Есть ли лучшее решение? Ну, если я подумаю о баре прогресса для SQL-запросов, я бы начал с оптимизации моих запросов. Очевидно, сейчас они слишком медленны. Используйте 'EXPLAIN ...', чтобы узнать, где узкие места. – feeela

ответ

0

Вы можете использовать reverse-ajax, а затем возвращать результат в iframe.

На стороне сервера используйте repsonse.flush (ASP.NET), чтобы получить частичный результат для клиента, когда завершен один шаг итерации.

Выходной код JavaScript, как:

window.parent.fnReportProgress(25.3) 

Кроме того, убедитесь, что вы не обновлять на каждом сообщении о ходе работы. Вместо этого сохраните сообщения в массиве, а затем опросите массив каждые x миллисекунд (setInterval) до завершения. Если вы не поместите все сообщения в массив, но сразу обновите индикатор выполнения, вы получите синий экран в IE и только в IE. Chrome + FF работает отлично.

Если вам нужно поддерживать только половинные современные браузеры (IE10 +) на полпути современных серверах (IIS 8+), вы также можете использовать WebSockets.

WebSockets также будет работать на серверах < IIS8, но тогда вам придется разрабатывать серверное приложение веб-сокетов отдельно, на отдельном порту.

 Смежные вопросы

  • Нет связанных вопросов^_^