Некоторые данные изменяются в базе данных.Как я могу запустить некоторый код на C #, выполняющий некоторую работу с этими изменениями?

StackOverflow https://stackoverflow.com/questions/513940

  •  21-08-2019
  •  | 
  •  

Вопрос

Предположим, у меня есть какое-то приложение A с базой данных.Теперь я хочу добавить еще одно приложение B, которое должно отслеживать изменения базы данных приложения A.Приложение B должно выполнить некоторые вычисления, когда данные изменились.Прямой связи между обоими приложениями нет.Оба могут видеть только базу данных.

Основная проблема заключается в том, что:Некоторые данные изменяются в базе данных.Как я могу запустить некоторый код на C #, выполняющий некоторую работу с этими изменениями?


Чтобы дать некоторый стимул для ответов, я упомяну некоторые подходы, которые я в настоящее время рассматриваю:

  1. Выполните опрос приложения B на предмет изменений в интересующих таблицах.Преимущество:Простой подход.Недостаток:Большой трафик, особенно когда задействовано много столов .
  2. Ввести триггеры, которые будут срабатывать при определенных событиях.Когда они запускаются они должны записать какую-либо запись в “таблицу событий”.Приложение Б нужно опросить, что “таблица событий”.Преимущество:Меньше пробок.Недостаток:Логика помещается в базу данных в виде триггеров.(Дело не в “зловредности” триггеров.Это вопрос дизайна , что делает его недостатком.)
  3. Избавьтесь от подхода опроса и используйте класс SqlDependency для получения уведомлений об изменениях.Преимущество:(Может быть?) Меньше трафика, чем при опросе подход.Недостаток:Не база данных независимый.(Я знаю о OracleDependency в ODP.NET, но что насчет других баз данных?)

Какой подход более благоприятен?Может быть, я упустил какое-то важное преимущество в упомянутых подходах?Может быть, есть какие-то другие подходы, о которых я не подумал?


Правка 1:Независимость базы данных является фактором для ...давайте позвоним им ..."продавцы".Я могу использовать SqlDependency или OracleDependency.Для DB2 или других баз данных я могу вернуться к подходу опроса.Это просто вопрос затрат и выгод, о котором я хочу, по крайней мере, подумать, чтобы иметь возможность обсудить это.

Это было полезно?

Решение

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

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

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

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

  • И вы можете отправить запрос ubber, который опрашивает несколько talbes (эффективно) и возвращает список измененных таблиц.

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

Другие советы

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

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

Лично мне нравится элегантность класса SqlDependency;и вообще, какое значение имеет независимость базы данных в реальном мире для большинства приложений?Но если для вас приоритетом является независимость от базы данных, то вы не можете это использовать.

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

Итак, мой ответ таков:это зависит от обстоятельств.:)

Удачи вам!

  1. Вы действительно заботитесь о независимости базы данных?
  2. Действительно ли было бы так сложно создать механизм различий для каждого типа базы данных, которые все имеют один и тот же открытый интерфейс?

Я знаю об OracleDependency в ODP.NET, но как насчет других баз данных?

В SQL Server есть что-то подобное, но я никогда им не пользовался.

Вы можете создать класс MySqlDependency и реализовать SqlDependency или SqlDependencyForOracle (объединение в пул)

Вы можете использовать SQL-триггер внутри SQL CLR Database Project и запустите свой код в этом проекте, см.: https://msdn.microsoft.com/en-us/library/938d9dz2.aspx

Или, при срабатывании внутри SQL CLR Database Project вы могли бы сделать запрос из SQL CLR Database Project для проекта, который вы на самом деле хотите запустить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top