Где я должен обрабатывать параллельные операции с одними и теми же данными?В приложении или базе данных? - PullRequest
0 голосов
/ 05 мая 2011

Итак, я создаю веб-приложение на Java с использованием Spring и Hibernate.В приложении пользователь может добавлять очки к объекту, и я хотел бы подсчитать количество очков, отданных за порядок моих объектов.Объекты также хранятся в базе данных.И, надеюсь, сотни людей будут одновременно давать очки объектам.

Но как мне посчитать очки и сохранить их в базе данных одновременно?Обычно я просто имею свойство на моем объекте и просто увеличиваю очки.Но это означало бы, что мне нужно заблокировать данные в базе данных с помощью пессимистичной транзакции, чтобы предотвратить проблемы параллелизма (считывание количества точек, пока другой поток уже находится на полпути для его изменения).Это могло бы сделать мое приложение намного медленнее (по крайней мере, я думаю, что так и будет).

Другим решением было бы хранить количество заданных точек в связанном объекте и сохранять их отдельно в базе данных при подсчете очков.в памяти внутри «небольшого» синхронизированного блока или чего-то еще.

Какое решение оказывает наименьшее влияние на производительность при обработке множества одновременных операций над одними и теми же объектами.Или есть другие подходящие решения?

1 Ответ

0 голосов
/ 05 мая 2011

Если вы хотите, чтобы значения сохранялись, вы должны сохранить их в своей базе данных.

Учитывая это, попробуйте следующее:

  1. создайте очень узкую строку, например, OBJ_ID и POINTS.
  2. создать индекс только для OBJ_ID, поэтому не тратится много времени на обновление индексов при вставке, обновлении или удалении значений.
  3. используйте INNODB, который имеет блокировку на уровне строк, поэтому блокировки будут меньше
  4. mysql выдаст вам последнее зафиксированное (непротиворечивое) значение

Все довольно просто. Дай вихрь! Установите тестовый пример, который имитирует ожидаемую нагрузку, и посмотрите, как она работает. Отпишитесь, если вы застряли.

Удачи.

...