jive2.1.2中SequenceManager问题,请指教,谢谢!!

02-12-26 flyings
jive2.1.2中SequenceManager类产生唯一id方法的主要思想是什么?

banq
2002-12-26 16:16
我有点记不清楚了:
为了防止两个用户同时得到一个ID 比如88, 各自+1后,写入数据库,结果数据库记录ID是89,其实这时应该是90。

jive采取了分段办法防止这个读和写不一致的情况,如果有人读取了ID但是没有更新数据库的ID,那么就另外一个用户就从下一段ID提取,比如88有人读取,那么同时有人再读时,就从88+15开始取ID

banq
2002-12-26 16:23
应该这么解释,为防止并发用户读取,预留一些号码,比如88+15,就是预留15个并发读取.

flyings
2002-12-26 16:38
public synchronized long nextUniqueID(){}本身不是就能防止并发吗?

banq
2002-12-26 17:43
这个方法只是保证并发来的用户排队一个个轮流执行nextUniqueID()方法,但是不能保证后一个用户执行nextUniqueID()时,前面一个用户已经执行完成nextUniqueID()

有点饶舌...

flyings
2002-12-26 20:27
多谢了,banq!!!

jxb8901
2002-12-27 10:38
我是这样理解的:
SequenceManager的作用就是产生一个整形序列号, 每当用户请求一个新ID时, SequenceManager就返回内部保存的ID值, 同时将其值加1, 以准备下一个请求.

Jive为了尽量减少数据库的读写次数, 它不是每取一个ID后就更新数据库, 而是先设置一个要更新数据库的maxID, 只有在当前ID到达这个maxID时才更新数据库(注意这时是将maxID增加一个常量值15后, 再以这个增加后的值更新数据库), 否则只是简单将当前ID加1而矣. 但是增加maxID的常量值也不能设得太大, 若其值太大, 当由于意外情况导致程序重启时, 未用的一段ID会由于来不及更新数据库而被浪费.

至于banq说的并发读取的问题, 我不明白, banq能再解释一下吗?

banq
2002-12-27 11:36
对,你的意思是对的,我是从"为什么要减少数据库的读写次数"来解释的,
因为数据库读写操作会耗费时间,有可能在已经读还没写时;另外一个用户中途突然进来,这时就很尴尬,所以用自增+1 就很快,基本没有这个问题。

当然,因为方法是同步的,所以我上面另外一个用户中途插入实际是没有可能的,那么带来另外一个问题就是这个用户必须排队在外等待,万一数据库写操作耗时,这个用户就可能等待很长时间,这在实践中是不能允许的。