'tail -f' таблица базы данных - PullRequest
8 голосов
/ 11 апреля 2011

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

Ответы [ 8 ]

7 голосов
/ 11 апреля 2011

Используйте триггер ON INSERT.

, вам нужно будет проверить детали вызова внешних приложений со значениями, содержащимися во вставленной записи, или вы напишите свое «приложение» как процедуру SQL изапустите его внутри базы данных.

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

5 голосов
/ 11 апреля 2011
  • Да, если база данных представляет собой простой текстовый файл и в конце выполняются добавления.
  • Да, если база данных поддерживает эту функцию другим способом; проверьте соответствующее руководство.
  • В противном случае нет. Базы данных, как правило, представляют собой двоичные файлы.
1 голос
/ 11 февраля 2015

Здесь есть несколько вариантов, некоторые из которых отмечены другими:

  • Периодически опрашивать новые строки. Хотя работает MVCC , можно пропустить строку, если в середине транзакции было два ВСТАВКИ во время последнего запроса.
  • Определите функцию триггера, которая будет выполнять некоторую работу за вас при каждой вставке. (В Postgres вы можете вызвать команду NOTIFY, которую могут СЛУШАТЬ другие процессы.) Вы можете объединить триггер с записью в таблицу unpublished_row_ids, чтобы гарантировать, что ваш процесс хвостов не пропустит ничего. (Затем процесс хвостовой обработки удаляет идентификаторы из таблицы unpublished_row_ids при их обработке.)
  • Подключитесь к функции репликации базы данных, если она есть. Это должно гарантировать, что строки не будут пропущены.

Более подробно о том, как сделать все эти опции с Postgres, я написал в блоге на http://btubbs.com/streaming-updates-from-postgres.html.

1 голос
/ 11 апреля 2011

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

1 голос
/ 11 апреля 2011

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

0 голосов
/ 13 апреля 2011

С помощью оракула вы можете выбрать псевдо-столбец с именем 'rowid', который дает уникальный идентификатор для строки в таблице, а rowid являются порядковыми ... новым строкам присваиваются идентификаторы строк, которые больше, чем у любого существующего rowid.

Итак, сначала выберите max (rowid) из table_name

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

Затем выберите * из таблицы_имя где rowid> 'what_that_rowid_string_was'

вам все равно придется периодически запускать запрос, но теперь это просто быстро и недорогозапрос

0 голосов
/ 11 апреля 2011

Я только что отправил тот же самый точный ответ, что и свечение, плюс еще одна идея:

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

0 голосов
/ 11 апреля 2011

tail в Linux, по-видимому, использует inotify, чтобы сообщить об изменении файла - возможно, он использует аналогичные структуры уведомлений файловой системы в других операционных системах. Поэтому он обнаруживает изменения файла.

Тем не менее, tail выполняет вызов fstat() после каждого обнаруженного изменения и не будет ничего выводить, пока размер файла не увеличится. Современные системы БД используют произвольный доступ к файлам и повторно используют страницы БД, поэтому вполне возможно, что вставленная строка не изменит размер файла резервной копии.

Вам лучше использовать inotify (или подобное) напрямую, и еще лучше, если вы используете триггеры БД или любой другой механизм, который ваша СУБД предлагает для отслеживания обновлений БД, поскольку не все обновления файлов обязательно являются вставками строк.

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