импортировать текстовый файл в базу данных SQL Server 2008 в режиме реального времени - PullRequest
1 голос
/ 31 января 2012

У меня есть машина, которая создает новый файл журнала в начале дня (12:00) и обновляет файл журнала всякий раз, когда есть какие-либо изменения до конца дня.

  1. Как импортировать данные в режиме реального времени (30 секунд, 1 минута или при любых изменениях) в базу данных моего сервера SQL?
  2. Будет ли SQL Server 2008 иметь доступактивный файл журнала?Если нет, то будет ли легче, если я позволю моей машине создавать новый файл журнала при любых обновлениях?Но если это так, как я могу импортировать так много файлов журнала с разными именами в режиме реального времени.(Я должен быть в состоянии масштабировать решение до нескольких машин)

Thx много

Ответы [ 3 ]

1 голос
/ 31 января 2012

Если у вас нет контроля над приложением, создающим файл, то у вас мало вариантов, кроме как опросить файл. Напишите приложение, которое регулярно опрашивает файл и записывает дельты в базу данных. Приложению нужно будет записать верхнюю отметку, к которой оно последний раз обращалось.

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

  • Открыть файл журнала
  • Поиск вашей последней записанной позиции EOF
  • Попробуйте прочитать
  • В случае успеха обработайте новые данные, пока не доберетесь до нового EOF.
  • Обновить вашу постоянную позицию EOF
  • Закрыть файл

Вам необходимо убедиться, что количество прочитанных байтов совпадает с позицией поиска вашего файла. Если файл журнала имеет кодировку Unicode, он может не иметь отображения 1: 1 между байтами и символами. Вам может понадобиться прочитать фрагменты файла в двоичном режиме и выполнить перевод символов из буфера.

После анализа записей в файле журнала вы можете просто вставить данные или использовать SQLBulkCopy для больших объемов данных.

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

1 голос
/ 31 января 2012

Вы можете регистрировать каждую новую строку с обратной меткой времени.

Поскольку вам нужно регистрироваться только при изменении файла, вы можете реализовать очередь в памяти который читает из файла и сохраняет данные. Затем реализуйте модель потребителя производителя, в которой один поток считывает и загружает данные из очереди, а потребитель записывает в базу данных. Служба Windows может продолжить чтение из очереди и войти в SQL Server. (Поскольку это потребитель-производитель, не будет никаких занятых в ожидании, если очередь пуста)

Каким-то образом вам также придется уведомлять ветку производителя при каждом создании журнала. Это можно сделать с помощью сокетов / или с помощью других средств, если у вас есть доступ к коду, который ведет запись.

0 голосов
/ 31 января 2012

Как насчет пакета служб SSIS, вызываемого запланированным заданием SQL Server?

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