Java " пул " лонгов или последовательность Oracle, которая повторно использует освобожденные значения
Несколько месяцев назад я реализовал решение для выбора уникальных значений из диапазона от 1 до 65535 (16 бит). Этот диапазон используется для генерации уникальных суффиксов целей маршрута, которые для этой клиентской массивной сети (это огромный провайдер) являются очень спорным ресурсом, поэтому любое выпущенное значение должно быть немедленно доступно конечному пользователю.
Для решения этого требования я использовал BitSet. Выделите суффикс в индексе RT с помощью set и освободите суффикс с помощью clear. То метод nextClearBit () может найти следующее доступное значение. Я обрабатываю проблемы синхронизации / параллелизма вручную.
Это работает довольно хорошо для небольшого диапазона... Весь индекс мал (около 10k), он быстро сверкает и может быть легко сериализован и сохранен в поле blob.
Проблема в том, что некоторые новые устройства могут обрабатывать RT-суффиксы 32 бит без знака (диапазон 1/4294967296). Который не может управляться с помощью набора битов (он сам по себе потребляет около 600 Мб, плюс быть ограничен
int - 32 битами подписанного диапазона). Даже с таким огромным диапазоном клиент все еще хочет освободить целевые суффиксы маршрута, которые становятся доступными конечному пользователю, главным образом потому, что самые низкие (до 65535) - которые совместимы со старыми маршрутизаторами - сильно оспариваются. Прежде чем я скажу клиенту, что это невозможно, и он должен будет соответствовать моему многоразовому индексу для более низких RTs (до 65550) и использовать последовательность базы данных для других (что означает, что когда пользователь освобождает цель маршрута, она больше не будет доступна), кто-нибудь прольет свет?
Может быть, какая-то добрая душа уже реализовала высокопроизводительный числовой пул для Java (6, если это имеет значение), или мне не хватает убийственной функции Oracle database (11R2, если это имеет значение)... Просто некоторые принимают желаемое за действительное :).
Заранее большое вам спасибо.
2 ответов:
Я бы объединил следующее:
Ваше текущее решение набора битов для 1-65535
Плюс
Решение на основе Oracle с последовательностью для 65536-4294967296, которая оборачивается вокруг определенной как
CREATE SEQUENCE MyIDSequence MINVALUE 65536 MAXVALUE 4294967296 START WITH 65536 INCREMENT BY 1 CYCLE NOCACHE ORDER;Эта последовательность дает вам упорядоченные значения в указанном диапазоне и позволяет повторно использовать любые значения, но только после достижения максимума - что должно позволить достаточно времени для освобождения значений... при необходимости вы можете отслеживать значения, используемые в таблице, и просто приращивайте дальше, если возвращаемое значение уже используется - все это можно красиво обернуть в хранимую процедуру для удобства...
Этот проект может оказаться полезным.
Comments