Много нашего кода устарело, но мы переходим к "Большим данным", и я пытаюсь разъяснять новые вызовы API, поощрять использование последних библиотек Spring и т.д. Один из наших проблемы - это генерация идентификатора прикладного уровня. По причинам, которые я не понимаю, высший орган требует последовательных BigInteger. Я бы сделал их случайными с повторным созданием и повторил попытку неудачных вставок, но я получил право вето.
Ворча в сторону, я в такой ситуации, когда мне нужно увеличивать и получать BigInteger по потокам и делать это безопасно и качественно. Я никогда раньше не использовал AtomicReference, но он выглядит довольно близок к совершенству для этого приложения. Прямо сейчас у нас есть синхронизированный блок кода, который сильно ухудшает нашу производительность.
Это правильный путь? Примеры синтаксиса?
Я должен упомянуть, что, как работает этот модуль, он попадает в базу данных с помощью хранимой процедуры, чтобы захватить диапазон значений для использования. Десятки тысяч за раз, так что это происходит только один раз в 20 минут. Это заставляет разные серверы наступать друг на друга, но также добавляет морщину необходимости устанавливать BigInteger на произвольно последующее значение. Конечно, это также должно быть потокобезопасным.
P.S. Я по-прежнему считаю, что моя идея о случайном поколении лучше, чем обработка всего этого потока. BigInteger - это смехотворно большое количество, и вероятность когда-либо генерировать одну и ту же секунду должна быть близка к нулю.