2011-07-21 5 views
1

В течение последних нескольких месяцев мы теряли данные при ошибках с задержкой записи. Я столкнулся с ошибкой как с обычным кодом, так и с приложениями для сжатия. Например, сообщение об ошибке доносился из Visual Studio 2008 на построение решенияЗадержка с ошибками записи

для Windows - Ошибка отложенной записи: Windows не удалось сохранить все данные файла \ Vital \ Source \ Other \ OCHSHP \ Done07 \ LHFTInstaller \ Release \ LHFAI.CAB. Данные были утеряны. Эта ошибка может быть вызвана сбоем вашего компьютерного оборудования или сетевого подключения . Попробуйте сохранить этот файл в другом месте.

Когда это происходит в Adobe, Visual Studio или Word, например, никакого вреда не делается. Основная проблема заключается в том, когда это происходит с нашими пользовательскими приложениями (прямое приложение C, которое записывает данные в файлы dBase в сетевой ресурс.)

С точки зрения программы запись преуспевает. Он удаляет исходные данные и переходит к следующей записи. Через несколько минут Windows выведет сообщение об ошибке, в котором говорится, что произошла запись с задержкой и данные были потеряны.

Мой вопрос, что мы можем сделать, чтобы помощью наших сетей/серверных команд изолировать и исправить эту проблему (читайте, убедить их проблема реальна. Просто говоря им много, много раз не убедили их пока еще), и есть ли у вас какие-либо предложения о том, как мы можем писать, чтобы избежать потери данных?

+0

Запись в файлы dBase по сетевым ресурсам? Ты храбрый человек, чем я! –

+0

@ Джонатан, код устаревшего, что я могу сказать? Я бы предпочел записывать данные на наш SQL-сервер, но наше решение должно работать как в магазине, так и в 40 + больницах по всему штату. В конце концов, он будет заменен веб-решением. До тех пор нам нужно предотвратить потерю данных. –

ответ

3

Писать в Windows, как и любую современную операционную систему, на самом деле не отправляют на диск, пока ОС не приблизится к нему. Это большой выигрыш в производительности, но проблема (как вы выяснили) заключается в том, что вы не можете обнаружить ошибки во время записи.

Каждая операционная система, которая выполняет асинхронную запись, также предоставляет механизмы для принудительной передачи данных на диск. В Windows функция FlushFileBuffers или _commit сделает трюк. (Один для HANDLE с, другими для дескрипторов файлов.)

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

Подробнее см. fsync() Across Platforms.

+0

Спасибо за совет! Хотя я хотел бы затронуть основные проблемы, которые вызывают проблемы, это, по крайней мере, предотвратит потерю данных. –

1

У вас есть поврежденная файловая система или жесткий диск, который не работает. Команда сетевого/сервера должна отсканировать диск, чтобы исправить первое и обнаружить последнее. Также проверьте журнал ошибок, чтобы узнать, говорит ли он вам что-либо. Если журнал ошибок указывает на то, что не удалось выполнить запись на оборудование, вам необходимо заменить диск.

+0

Спасибо! Я попытаюсь заставить нашу серверную команду посмотреть на нее.Я знаю, что они сжали этот диск, чтобы избежать покупки большего объема памяти. Наш офис предложил купить больше памяти, но им сказали: «У нас нет проблемы с хранением, у нас проблема с пользователем». Более 1000 человек используют эту порцию как свою основную долю сети. –

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