#java #sql #postgresql #spring-boot #jpa
Вопрос:
Так что у меня есть столик:
Resource(rm_id::UUID, resource_id::UUID, available::boolean, date::Date, node_id::varchar, start_time::varchar, end_time::varchar, created_at: DateTime, updated_at: DateTime)
Итак, я использую некоторые события обновления ресурсов из темы из GCP.
У меня есть 2 вида событий: события resource_availability и события resource_unavailability.
Данные о событиях
(resource_id, date, available, start_time, end_time)
Поэтому всякий раз, когда возникает событие, независимо от проверки того, существует запись или нет, я выполняю этот запрос
update resource set available = :available, updated_at = :updatedAt where resource_id = :someId AND date = :some_date AND start_time = :someTime AND endTime = :someTime
В настоящее время у меня есть этот индекс
CREATE index resource_update_select on resource(resource_id, node_id, date);
Итак, предположим, что существует несколько событий
{"resource_id":1, "available": true, "date": "date1", start_time = "00:00", "end_time" = "23:59"}
{"resource_id":1, "available": true, "date": "date1", start_time = "23:00", "end_time" = "23:30"}
{"resource_id":2, "available": true, "date": "date2", start_time = "00:00", "end_time" = "23:59"}
{"resource_id":3, "available": true, "date": "date3", start_time = "00:00", "end_time" = "23:59"}
Вышеуказанные события подхватываются различными потоками/блоками, теперь, когда они выполняются параллельно, они увеличивают время ожидания блокировки, как я вижу из GCP Query Insights. Я не уверен, что я здесь делаю не так? Должен ли я сделать выбор, чтобы проверить, существует ли какая-либо запись в таблице, а затем обновить запись, или я что-то еще делаю не так?? Пожалуйста, помогите мне.
Примечание: Количество событий, которые я получаю, огромно, вы можете сказать, что каждый модуль может обрабатывать 10 потоков, а модули могут масштабироваться до 20 модулей. Таким образом, 200 потоков могут одновременно обрабатывать, я думаю, именно это и является причиной проблемы.
Обновление 1:
Ожидание блокировки еще больше увеличивает производительность процессора моей базы данных до 100%. Вот тут-то все и становится плохо.
Комментарии:
1. Когда вы начинаете и заканчиваете транзакции? И есть ли на самом деле проблема? Если время, проведенное в ожидании блокировки, в противном случае было бы потрачено в режиме ожидания, то имеет ли это значение?
2. Как измеряется процессор DB? Ожидание с высокой блокировкой обычно должно приводить к снижению процессора, так как ожидание не потребляет много процессора
3. Я не уверен, как измеряется процессор DB в GCP, нужно проверить это один раз, но я вижу, что всплеск процессора увеличивается до 70-100%, в то время как ожидание блокировки увеличилось. Мне тоже это показалось странным.