几个月前,我实施了一个解决方案,从1到65535(16位)之间选择唯一值。此范围用于生成唯一的路径目标后缀,对于此客户来说,大规模网络(它是一个巨大的ISP)是一个非常有争议的资源,因此任何已发布的值都需要立即供最终用户使用。
为了解决这个问题,我使用了BitSet。使用set
在RT索引上分配后缀,并使用clear
取消分配后缀。方法nextClearBit()可以找到下一个可用值。我手动处理同步/并发问题。
这适用于小范围...整个索引很小(大约10k),它非常快速,可以很容易地序列化并存储在blob字段中。
问题是,一些新设备可以处理32位无符号的RT后缀(范围1/4294967296)。哪个不能用BitSet管理(它本身会消耗大约600Mb,加上限制为int
- 32位有符号 - 范围)。即使有这么大的范围,客户仍然希望释放最终用户可用的路由目标后缀,主要是因为与旧路由器兼容的最低端(最多65535)受到很大争议。
在我告诉客户这是不可能的之前,他必须符合我的可重用索引以获得较低的RT(最高65550)并使用数据库序列来实现其他的(这意味着当用户释放路由目标时) ,它将不会再次出现),是否会有人发光?
也许某种灵魂已经实现了Java的高性能数字池(如果重要,则为6),或者我错过了Oracle数据库的杀手级功能(11R2,如果重要的话)......只是一些一厢情愿的想法:)。
非常感谢你。
答案 0 :(得分:3)
This project可能有用。
答案 1 :(得分:3)
我会结合以下内容:
您当前的BitSet解决方案1-65535
PLUS
基于Oracle的解决方案,序列为65536 - 4294967296,其中包含定义为
CREATE SEQUENCE MyIDSequence
MINVALUE 65536
MAXVALUE 4294967296
START WITH 65536
INCREMENT BY 1
CYCLE
NOCACHE
ORDER;
此序列为您提供指定范围内的有序值,并允许重复使用任何值,但仅在达到最大值后 - 这应该允许有足够的时间释放值...如果需要,您可以跟踪值在表中使用,如果返回的值已经在使用中,则进一步递增 - 为方便起见,所有这些都可以很好地包装到存储过程中...