2013-10-13 1 views
0

Когда мое приложение запускается, я получаю дату/время с SQL Server с помощью SELECT CURRENT_TIMESTAMP и сравнивая разницу с локальной датой/временем - и записываю это смещение. Каждое действие, которое записывает дату/время, будет скорректировано на основе этой разницы во времени. Поэтому всякий раз, когда я сохраняю дату/время, это будет сервер, не запрашивая сервер каждый раз каждый раз, когда мне это нужно.Как измерить точное смещение по времени от SQL Server?

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

Как измерить это время задержки между моментом, когда SQL Server получает текущую дату/время до момента получения моего приложения?

Учитывая, что SQL Server - такой мощный механизм базы данных, я бы предположил, что для этого есть встроенный трюк.

+0

Мне любопытно, что приложение требует этой точности. Если вам нужно знать точное время на сайте сервера, вопрос о сетевом отставании может быть наименее из ваших проблем. –

+0

Не было бы лучше синхронизировать все ваши серверы с общим источником времени и хранить все даты через 'GETUTCDATE()' – podiluska

+0

Это уже хорошо развитое устаревшее приложение с транзакционной структурой, которая в настоящее время имеет очень плохой способ отслеживания времени. Все записывается как дата/время сервера, но он запрашивает сервер каждый раз, когда он ему нужен. Я настраиваю его, чтобы сделать его более точным и более эффективным, сохраняя при этом структуру базы данных в тактике (никаких серьезных изменений). Если бы это было в раннем развитии, я бы использовал UTC. –

ответ

1

Это более общая проблема на самом деле в теории передачи данных, а не только в отношении SQL Server. Один из способов решения этого вопроса - сделать 3 или 5 рукопожатие в начале и найти среднее время одного ACK. Затем используйте это как Delta для всех будущих сообщений.

В случае с SQL Server вы можете запустить очень простой запрос, например SELECT 1, и проверить, сколько времени требуется для получения результатов. Одна из ошибок заключается в том, чтобы избежать использования какого-либо низкоуровневого механизма, такого как TCP (в случае, если вы также контролируете серверную сторону), поскольку выполнение запроса будет гарантировать, что общая дельта, которую вы вычисляете, включает время, когда SQL Server получает запрос и анализирует и т.д., а также.

+0

Значит, вы имеете в виду делать это примерно 3 раза и измерять среднее время на полпути? –

+0

Да, это точно. – dotNET

+0

Это сработает, но я считаю это грязным решением. +1, но я буду ждать, если у кого-то будет более точное решение. –

1

Невозможно быть уверенным. Учтите, что запрос на получение занимает 3 секунды. Возможно, потребовалось 2 секунды для запроса, чтобы добраться до сервера, и 1 секунда для ответа, чтобы вернуться к вам. Или, возможно, потребовалось 1 секунду для запроса на сервер и 2 секунды для получения от сервера квитанции.

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

Учитывайте также, что задержка будет меняться со временем. Запрос, который вы отправляете сейчас, может иметь задержку в 1 секунду, но запрос, отправленный через час, может занять половину этого времени или в два раза в зависимости от нагрузки в сети.

+0

Отличная информация для рассмотрения, но не обязательно решение вопроса. –

+2

Вероятно, не будет решения –

+0

(комментарий удален) –

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

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