Ответ 1
Нет, таких встроенных функций пока нет. Вам нужно "ping" (каждые 1-5 секунд) базу данных с выбором с заранее установленным флагом, например "read" 0/1. После
SELECT * FROM mytable WHERE read = 0
обновите его с помощью read = 1
Есть ли эквивалент PostgresQL notify и listen в MySQL? В принципе, мне нужно прослушивать триггеры на моем сервере приложений Java.
Нет, таких встроенных функций пока нет. Вам нужно "ping" (каждые 1-5 секунд) базу данных с выбором с заранее установленным флагом, например "read" 0/1. После
SELECT * FROM mytable WHERE read = 0
обновите его с помощью read = 1
Итак, я обнаружил, что вы можете делать UDF-функции в mysql, которые могут что-то делать, но должны быть написаны на C/С++. Затем они могут быть вызваны из триггеров обновлений в базе данных и уведомлять ваше приложение о произошедшем обновлении. Я видел, что есть некоторые проблемы с безопасностью. Я не использовал его сам, но из того, что я вижу, он выглядит как нечто, что может выполнить то, что вы хотите сделать, и многое другое.
Мне нужно было это сделать, поэтому я разработал приложение для отправки уведомлений об обновлении.
например. --Scenario-- Пользователь A смотрит на запись 1 Пользователь B сохраняет обновление для записи 1, пока пользователь A открывает его.
процесс:
Я написал свой собственный сервер сокетов в качестве службы Windows. Я разработал похожую систему, которая в основном,
EntityType EntityID NoticeType
Если EntityType является типом Poco в моем слое данных, который должен отправлять уведомления, EntityID - это первичное ключевое значение строки, которая изменилась в sql (значения poco), а NoticeType - 1 Обновлено, 2 Inserted и 3 Deleted.
Сервер сокетов принимает соединения из кода приложения на стороне сервера в безопасном соединении, то есть код на стороне клиента не может делать запросы, предназначенные для отправки кодом приложения на стороне сервера.
Сервер сокетов принимает сообщение типа
900 1 1023 1
Это означало бы, что серверу необходимо уведомить связанные клиентские соединения о том, что Entity Type 1 "Person" с идентификатором 1023 был обновлен.
Сервер знает, что пользователям нужно получать уведомления, потому что, когда пользователь просматривает запись, они регистрируются на сервере сокетов как имеющие интерес к записи и идентификатор записи, который выполняется кодом веб-сокета на стороне клиента JavaScript.
Запись 1 - это POCO в моем коде приложения, в котором есть поле IsNew и IsDirty. "Использование EntityFrameWork6 и MySql" Если UserB save вызвало фактическое изменение (а не только сохранение существующих данных), IsDirty будет истинным при обратной передаче в UserB POCO.
Код приложения, смотрящий на запись, загрязнен, затем уведомляет сервер сокета с помощью отправленного сокета на стороне сервера, "который будет разрешен", в котором говорится, что Entity 1 с идентификатором 1023 был обновлен.
Сервер сокетов видит его и помещает в очередь.
Будучи .NET, у меня есть класс для заинтересованных пользователей, который использует одни и те же pocos из уровня данных, запущенного в службе окна Socket Server. Я использую linq для выбора пользователей, которые работают с сущностью, соответствующей типу объекта и идентификатору первичного ключа объекта в очереди.
Затем он проходит через этих пользователей и отправляет им сокет, подобный 901 1 1023 1 давая им знать, что объект был обновлен.
Javascript на стороне клиента получает его, заставляя страницу пользователя B выполнять обратную передачу ajax в записи 1, но то, что происходит с UserA, отличается.
Если пользователь A в процессе внесения изменений, они будут всплывать, чтобы показать им, что изменилось, и каково их новое значение, если они нажмут "Сохранить" и спросят, какое изменение они хотят сохранить. Если UserA не имеет изменений, он выполняет обратную передачу ajax с верхней панелью уведомлений, в которой говорится, что "Запись изменений: обновлено автоматически" истекает через несколько секунд.
Против этого, 1. Он очень сложный 2. Он не будет улавливать операции вставки/обновления/удаления извне приложения.
В моем случае 2 не произойдет, и если 2 произойдет это сам или другим разработчиком, который знает, как вручную создавать запросы уведомлений que, "для этого нужно создать страницу администратора".