SSIS обрабатывает файлы из папки - PullRequest
0 голосов
/ 19 марта 2010

Справочная информация:

У меня есть папка, в которую постоянно загружаются файлы. Мой пакет служб SSIS должен обрабатывать файлы и удалять их. Пакет служб SSIS планируется запускать раз в минуту. Я собираю файлы в порядке возрастания времени создания файла. Я создаю массив файлов, а затем обрабатываю и удаляю их по одному.

Проблема:

Если запуск экземпляра моего пакета занимает более одной минуты, следующий экземпляр пакета служб SSIS извлечет некоторые файлы из предыдущего экземпляра в своем буфере. К тому времени, когда второй экземпляр пакета приступает к обработке файла, он, возможно, уже был удален первым экземпляром, что создает исключительную ситуацию.

Мне было интересно, есть ли способ избежать условия исключения.

Спасибо.

Ответы [ 5 ]

1 голос
/ 28 марта 2010

Как вы планируете работу? Если вы используете планировщик заданий SQL Server, у меня сложилось впечатление, что не следует повторно запускать уже запущенное задание; см. этот вопрос: Будет ли задание SQL Server пропускать запланированный запуск, если оно уже выполняется?

В качестве альтернативы, вместо того, чтобы перемещать файл, вы можете создать шаг своей работы, чтобы проверить, работает ли он уже. Я сам этого не делал, но было бы возможно, прочитайте эту статью Определение состояния задания агента SQL Server

1 голос
/ 19 марта 2010

Можете ли вы проверить наличие файла перед его удалением.

File.Exists (filepathandname)

0 голосов
/ 02 мая 2010

У меня похожая ситуация. Что вы делаете, так это чтобы ваш пакет служб SSIS прочитал все файлы в папке и создал рабочий файл, такой как «process.txt». Это создаст список допустимых файлов на тот момент. Если у вас есть несколько пакетов, создайте файл с именем, например «process_.txt». Пакет будет обрабатывать только файлы, указанные в их файле процесса. Это предотвратит перекрытие.

0 голосов
/ 28 марта 2010

Вы можете создать «файл блокировки», чтобы предотвратить параллельное выполнение пакетов. Чтобы защитить себя от случая с аварийным пакетом, используйте дату создания файла, чтобы эмулировать время ожидания блокировки.

Т.е.: в начале пакета вы проверите наличие файла блокировки. Если он не существует ИЛИ он был создан более X часов назад - тогда продолжайте импорт. В противном случае выйдите.

0 голосов
/ 28 марта 2010

Чтобы убедиться, что ваш пакет не работает с одними и теми же файлами, вы можете просто создать пустой файл с именем, аналогичным имени файла, но с другим расширением (например, mydata.csv.being_processes), и убедиться, что ваша задача потока данных выполняется только нафайлы, которые не имеют такого файла.

Это действует как блокировка.

Конечно, вы можете изменить способ планирования своих заданий, но часто - когда мы сталкиваемся с такой проблемой -это потому, что у нас нет рычагов для этих вещей:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...