2011-02-03 3 views
0

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

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), если не присутствует блокировка ключа и создаю идентификатор. Это уменьшит конкуренцию и гарантирует уникальность.

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

+0

id является локальной переменной –

+1

, если я вызываю getIdViaDAO с тем же пользователем и сервисом снова и снова (используя один поток), всегда ли я получаю тот же ID? кроме того, любая другая комбинация пользовательской + службы будет генерировать другой идентификатор? – chahuistle

ответ

0

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

  • убедитесь, идентификатор пользователя и службы реализации хэш-код() и Equals() правильно
  • убедитесь, чтобы иметь синхронизированный() блокировку вокруг метода
  • всего создания()
Смежные вопросы