У нас есть приложение Java, которое кэширует всю информацию (~ 5000 записей в 7 таблицах) из базы данных Postgres. Проблема в том, что база данных обновляется извне, и кеш должен знать, когда нужно признать недействительным. Следует отметить, что мы не ожидаем много вложений/обновлений.
Postgres предоставляет отличное решение для этого путем прослушивания/уведомления и триггера при вставке/обновлении; единственная проблема связана с драйвером JDBC для Postgres, который не знает асинхронно прослушивать уведомления и требует опроса и не нашел решения для асинхронного прослушивания с Java.
Вопрос заключается в том, как сконструировать триггер обновления кэша в этом случае, чтобы достичь максимальной производительности и ограничить время, в течение которого кеш является непоследовательным. Описан ли вышеописанный механизм (создайте триггеры для каждой таблицы, а затем отдельные каналы для прослушивания/уведомления и опроса для уведомлений), или было бы быстро создать такой запрос, как этот select * from table where update_timestamp >?
и указанным параметром является дата последней отметки времени обновления кеша (предположим, что столбец проиндексирован).
Проще говоря, уведомляет/слушает с опросом, заслуживающим внимания, или запрашивает опрос быстрее?
Это зависит от частоты уведомлений. Если вы получаете 100 уведомлений в секунду, это может быть "медленнее" (= требуется больше ресурсов ЦП), а затем опрос, поскольку у вас больше переключателей контекста ОС.
Для асинхронных уведомлений обратитесь к драйверу pgjdbc-ng 0.6.
http://impossibl.github.io/pgjdbc-ng/
Он поддерживает асинхронные уведомления без опроса.