Синхронизация Java со значениями БД - PullRequest
0 голосов
/ 03 февраля 2011

Мне дали код, он создает уникальный идентификатор на основе имени пользователя и типа сервиса. Уникальный идентификатор находится в db, db читается через классы DAO, которые я не вижу. создание идентификатора занимает много шагов.

create(user,service) {
    id=getIdViaDAO(user,service)
    if(id==null) {
        create few classes and call few methods.
        id=generareId(few objects)
        session.setId(id)
        dao.createSession(session)
    }
    return id
}

В многопоточной среде нет гарантии для уникального идентификатора.

Для гарантии уникальности

Решение: Я бы кэшировал идентификатор в ConcurrentHashmap с сервисом userId + в качестве ключа и id в качестве значения. Всякий раз, когда метод вызывается, я проверяю значение (id), если нет блокировки на ключ и создаю идентификатор. Это уменьшит конкуренцию и гарантирует уникальность.

Хотите знать, есть ли какая-либо проблема в моем решении и / или есть ли лучшее решение для этого?

1 Ответ

0 голосов
/ 05 февраля 2011

один и тот же пользователь и служба должны дать вам один и тот же идентификатор, так что вы в порядке.Пару вещей, на которые следует обратить внимание:

  • убедитесь, что идентификатор пользователя и служба правильно реализуют hashCode () и equals ()
  • , убедитесь, что синхронизированная () блокируется вокругвесь метод create ()
...